首页 > 代码库 > [Leetcode] 445. Add Two Numbers II

[Leetcode] 445. Add Two Numbers II

问题: https://leetcode.com/problems/add-two-numbers-ii/#/description

思路:该题与“415. Add Strings”类似,都需要先将原来的数字序列翻转,然后就转化成了跟“2. Add Two Numbers”类似的问题,进而就容易解决多了。

但是本题又规定不允许对原来的链表进行翻转,所以可以采用其他的方式曲线救国。这里可以利用栈的后进先出的特性,来变相实现输入链表的翻转。

Java实现代码如下:

 1 /**
 2  * Definition for singly-linked list.
 3  * public class ListNode {
 4  *     int val;
 5  *     ListNode next;
 6  *     ListNode(int x) { val = x; }
 7  * }
 8  */
 9 public class Solution {
10     public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
11         // 使用推荐的Deque来代替旧的Stack
12         Deque<Integer> stack1 = new LinkedList<>();
13         Deque<Integer> stack2 = new LinkedList<>();
14         
15         // 使用栈对两个输入链表进行翻转
16         for(ListNode p = l1; p != null; p = p.next) {
17             stack1.addFirst(p.val);
18         }
19         for(ListNode p = l2; p != null; p = p.next) {
20             stack2.addFirst(p.val);
21         }
22         
23         int carry = 0;  // 进位
24         ListNode result = null;
25         while(stack1.size() > 0 || stack2.size() > 0) {
26             int sum = 0;
27             // 如果第一个链表里的对应位上还有数
28             if(stack1.size() > 0) {
29                 sum += stack1.removeFirst();
30             }
31             // 如果第二个链表里的对应位上还有数
32             if(stack2.size() > 0) {
33                 sum += stack2.removeFirst();
34             }
35             sum += carry;
36             ListNode node = new ListNode(sum % 10);
37             node.next = result;
38             result = node;
39             carry = sum / 10;
40         }
41         // 如果最高位相加后还有进位
42         if(carry > 0) {
43             ListNode node = new ListNode(carry);
44             node.next = result;
45             result = node;
46         }
47         
48         return result;
49     }
50 }

 

[Leetcode] 445. Add Two Numbers II