题目
给定两个 非空链表 l1
和 l2
来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。
可以假设除了数字 0 之外,这两个数字都不会以零开头。
示例1:
输入:l1 = [7,2,4,3], l2 = [5,6,4]
输出:[7,8,0,7]
1
2
2
示例2:
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[8,0,7]
1
2
2
示例3:
输入:l1 = [0], l2 = [0]
输出:[0]
1
2
2
提示:
- 链表的长度范围为
[1, 100]
0 <= node.val <= 9
- 输入数据保证链表代表的数字无前导 0
**进阶:**如果输入链表不能修改该如何处理?换句话说,不能对列表中的节点进行翻转。
注意:本题与主站 445 题相同:https://leetcode-cn.com/problems/add-two-numbers-ii/
题解
java
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
int len1 = 0, len2 = 0;
ListNode c1 = l1, c2 = l2;
// 数字长度遍历
while (c1 != null) {
c1 = c1.next;
len1++;
}
while (c2 != null) {
c2 = c2.next;
len2++;
}
// 指针重置
c1 = l1;
c2 = l2;
// 辅助栈
Stack<Integer> stack = new Stack<>();
// 按照位数对应
while (len1 > len2) {
stack.push(c1.val);
c1 = c1.next;
len1--;
}
while (len2 > len1) {
stack.push(c2.val);
c2 = c2.next;
len2--;
}
// 剩余数字相加
while (len1 > 0) {
stack.push(c1.val + c2.val);
c1 = c1.next;
c2 = c2.next;
len1--;
}
ListNode r = new ListNode(0);
// 节点追加方法
Consumer<Integer> append = val -> {
ListNode t = new ListNode(val);
t.next = r.next;
r.next = t;
};
// 进位
int carry = 0;
while (!stack.isEmpty()) {
int val = stack.pop() + carry;
carry = val / 10;
val %= 10;
append.accept(val);
}
// 最后还剩余进位
if (carry > 0) {
append.accept(carry);
}
return r.next;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62