长大后想做什么?做回小孩!

0%

LeetCode——两数相加II

NO.445 两数相加II 中等

Gxt9kq.png

本题和姊妹题NO.2两数相加的区别在于,本题的参数是”正序”的链表,不能像NO.2直接从表头到表尾依次相加。本题的关键点在于如何将链表进行翻转。

思路一:翻转链表

NO.206题一样翻转两个链表,本题就转换为NO.2。

时间复杂度:O(n) 两次遍历。

思路二:栈

“翻转”、”逆序”一般都可以利用栈的特性,将两个参数链表,分别压栈,然后依次出栈相加。

相加的结果利用头插法生成结果链表。

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
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
if (l1==null)return l2;
if (l2==null)return l1;
//参数链表入栈
Stack<Integer> stack1=new Stack<>(),stack2=new Stack<>();
while (l1 != null) {
stack1.add(l1.val);
l1=l1.next;
}
while (l2 != null) {
stack2.add(l2.val);
l2=l2.next;
}
//依次出栈相加
int carry=0;
ListNode dummy=new ListNode(-1);
while (!stack1.isEmpty() || !stack2.isEmpty()) {
int x=stack1.isEmpty()?0:stack1.pop();
int y=stack2.isEmpty()?0:stack2.pop();
int sum=x+y+carry;
carry=sum/10;
//头插法
ListNode node=new ListNode(sum%10);
node.next=dummy.next;
dummy.next=node;
}
if (carry != 0) {
ListNode node=new ListNode(carry);
node.next=dummy.next;
dummy.next=node;
}
return dummy.next;
}

时间复杂度:O(n) 两次遍历。


本人菜鸟,有错误请告知,感激不尽!

更多题解和源码:github