445. Add Two Numbers II 链表中的数字求和

[抄题]:

You are given two non-empty linked lists representing two non-negative integers. The most significant digit comes first and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.

You may assume the two numbers do not contain any leading zero, except the number 0 itself.

Follow up:
What if you cannot modify the input lists? In other words, reversing the lists is not allowed.

Example:

Input: (7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 8 -> 0 -> 7

 [暴力解法]:

时间分析:

空间分析:

 [优化后]:

时间分析:

空间分析:

[奇葩输出条件]:

[奇葩corner case]:

最后看第一位是不是0,不是0才能返回。

[思维问题]:

顺序是反的,不知道用stack

通过sum / 10的方法可以把十位取出来,不用清空,每次除10一直加就行了

[英文数据结构或算法,为什么不用别的数据结构或算法]:

[一句话思路]:

顺序是反的就要用stack求和

[输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):

[画图]:

[一刷]:

  1. 先初始化一个待添加列表list,然后余数都往后面加。求和的头都放在head中。

[二刷]:

  1. list.val = sum % 10; 可以直接往用等号list后面加点,不知道怎么来的

[三刷]:

[四刷]:

[五刷]:

  [五分钟肉眼debug的结果]:

[总结]:

通过sum / 10的方法可以把十位取出来,不用清空,每次除10一直加就行了。倒序相加用stack

[复杂度]:Time complexity: O(n) Space complexity: O(n)

[算法思想:迭代/递归/分治/贪心]:

[关键模板化代码]:

[其他解法]:

[Follow Up]:

[LC给出的题目变变变]:

 [代码风格] :

 [是否头一次写此类driver funcion的代码] :

 [潜台词] :

 

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        //initialization: 2 stacks
        Stack<Integer> stack1 = new Stack<Integer>();
        Stack<Integer> stack2 = new Stack<Integer>();
        
        //corner case
        if (l1 == null && l2 == null) return null; 
        
        //put into stacks
        while (l1 != null) {
            stack1.add(l1.val);
            l1 = l1.next;
        }
        
        while (l2 != null) {
            stack2.add(l2.val);
            l2 = l2.next;
        }
        
        //while loop
        //get sum, val, head, append the previous val to head, give head to val, reset sum
        ListNode list = new ListNode(0);
        int sum = 0;
        while (!stack1.isEmpty() || !stack2.isEmpty()) {
            //get sum
            if (!stack1.isEmpty()) sum += stack1.pop();
            if (!stack2.isEmpty()) sum += stack2.pop();
            
            //get the val node
            list.val = sum % 10;
            
            ListNode head = new ListNode(sum / 10);
            //append the previous val to head, head is ready
            head.next = list;
            //give head to val
            list = head;
            
            sum /= 10;
        }
        
        //return
        return list.val == 0 ? list.next : list;
    }
}
View Code

 

posted @ 2018-08-01 15:37  苗妙苗  阅读(171)  评论(0编辑  收藏  举报