题目描述
题目链接
https://leetcode.cn/problems/add-two-numbers/
思路
由于输入的两个链表都是逆序存储数字的位数的,因此两个链表中同一位置的数字可以直接相加。
我们同时遍历两个链表,逐位计算它们的和,并与当前位置的进位值相加。具体而言,如果当前两个链表处相应位置的数字为,进位值为
,则它们的和为
;其中,答案链表处相应位置的数字为
,而新的进位值为
。
如果两个链表的长度不同,则可以认为长度短的链表的后面有若干个 0,继续进行相加。此外,如果链表遍历结束后,有,还需要在答案链表的后面附加一个节点,节点的值为当前的
。
代码实现
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {// 表示当前是否需要进位int carry = 0;ListNode h1 = l1, h2 = l2;ListNode res = new ListNode(0);ListNode cur = res;while (h1 != null || h2 != null) {int v1 = h1 == null ? 0 : h1.val;int v2 = h2 == null ? 0 : h2.val;// 计算总和int sum = v1 + v2 + carry;// 判断是否进位carry = sum / 10;// 添加当前节点元素cur.next = new ListNode(sum % 10);cur = cur.next;if (h1 != null) {h1 = h1.next;}if (h2 != null) {h2 = h2.next;}}// 最后看是否需要向前补一位if (carry > 0) {cur.next = new ListNode(carry);}return res.next;}
复杂度分析
- 时间复杂度:
,其中
和
分别为两个链表的长度。我们要遍历两个链表的全部位置,而处理每个位置只需要
的时间。
- 空间复杂度:
。注意返回值不计入空间复杂度。
