NO.445 两数相加II 中等
本题和姊妹题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