2.Add Two Numbers

题目链接:https://leetcode.com/problems/add-two-numbers/description/

题目大意:给出两个单链表,表示两个数字,这两个数字中的每一位上的数字在单链表中都倒序存放,每个结点中都含有一个非负整数,计算这两个数字的和,要求倒序插入到单链表中并返回。例子如下:

法一(WA):利用栈,对于每一个链表,将数字取出来依次放入栈中,然后再取出存成它本来表示的数,然后将两个数相加,再将相加的结果存放进单链表中返回。这个解法比较好理解,就是转换成数学数字再计算,但是当数字长度超过int范围的时候就会发生问题,也就是int会存不下的问题。代码如下:

 1     public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
 2         Stack<Integer> stack1 = new Stack<Integer>();
 3         Stack<Integer> stack2 = new Stack<Integer>();
 4         while(l1 != null) {
 5             stack1.push(l1.val);
 6             l1 = l1.next;
 7         }
 8         while(l2 != null) {
 9             stack2.push(l2.val);
10             l2 = l2.next;
11         }
12         int num1 = 0, num2 = 0;
13         while(!stack1.isEmpty()) {
14             num1 = num1 * 10 + stack1.pop();
15         }
16         while(!stack2.isEmpty()) {
17             num2 = num2 * 10 + stack2.pop();
18         }
19         int num = num1 + num2;
20         ListNode l = new ListNode(num % 10);
21         num = num / 10;
22         ListNode tmp = null, p = l;
23         while(num != 0) {
24             tmp = new ListNode(num % 10);
25             tmp.next = null;
26             p.next = tmp;
27             p = tmp;
28             num = num / 10;
29         }
30         return l;
31     }
View Code

法二:在经历上个方法的失败后,立马想到了大数加法,转而用大数加法顺利成章的做,迎刃而解,只是要处理一些细节问题,比如要考虑到最后flag不是0而是1的问题。代码如下(耗时55ms):

 1     //类似大数加法
 2     public ListNode addTwoNumbers2(ListNode l1, ListNode l2) {
 3         ListNode l = null, tmp = null, p = null;
 4         int flag = 0, num = 0;
 5         while(l1 != null && l2 != null) {
 6             if(l == null) {
 7                 num = l1.val + l2.val;
 8                 flag = num / 10;
 9                 l = new ListNode(num % 10);
10                 l.next = null;
11                 p = l;
12             }
13             else {
14                 num = l1.val + l2.val + flag;
15                 flag = num / 10;
16                 tmp = new ListNode(num % 10);
17                 tmp.next = null;
18                 p.next = tmp;
19                 p = tmp;
20             }
21             l1 = l1.next;
22             l2 = l2.next;
23         }
24         while(l1 != null) {
25             num = flag + l1.val;
26             flag = num / 10;
27             tmp = new ListNode(num % 10);
28             tmp.next = null;
29             p.next = tmp;
30             p = tmp;
31             l1 = l1.next;
32         }
33         while(l2 != null) {
34             num = flag + l2.val;
35             flag = num / 10;
36             tmp = new ListNode(num % 10);
37             tmp.next = null;
38             p.next = tmp;
39             p = tmp;
40             l2 = l2.next;
41         }
42         if(flag != 0) {
43             tmp = new ListNode(flag);
44             tmp.next = null;
45             p.next = tmp;
46             p = tmp;
47         }
48         return l;
49     }
View Code

 

posted on 2017-10-28 20:41  二十年后20  阅读(138)  评论(0编辑  收藏  举报

导航