[Leetcode] Add two numbers 两数之和

You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.

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

题意:求以链表形式表示的两非负整数之和,高位在后。

思路:联想数组形式的计算,以一个变量carry为对应位置的和,carry%10为当前值,carry/10为进位。在数组里,直接在长度较大的数组更新值就行,但是链表的长度没法直接获得。所以出现了问题一:如何保存数据。所以针对这个问题有两种解法,但求和的思想还是不变。问题二、若是最高位有进位,怎么办?这种情况下,只能新建一个结点,然后赋值。

方法一:开辟一个新的链表,每次都是将对应的值赋给新开辟的结点。这就遇到循环条件的问题,若是l1&&l2则会遇到有其中一个链表遍历完时,剩下的链表的进位情况,若剩下的结点值全是9,即存在进位的可能则可能有需要另一个while循环,所以这里为代码的简洁还是用 l1||l2 。还有一点值得注意的是,对当前结点的取值一定要在当前结点存在的情况下,不然会造成错误。代码如下:

 1 /**
 2  * Definition for singly-linked list.
 3  * struct ListNode {
 4  *     int val;
 5  *     ListNode *next;
 6  *     ListNode(int x) : val(x), next(NULL) {}
 7  * };
 8  */
 9 class Solution {
10 public:
11     ListNode *addTwoNumbers(ListNode *l1, ListNode *l2) 
12     {
13         if(l1==NULL)    return l2;
14         if(l2==NULL)    return l1;
15 
16         int carry=0;
17         ListNode *nList=new ListNode(-1);
18         ListNode *pre=nList;
19 
20         while(l1||l2)
21         {
22             if(l1)
23             {
24                 carry+=l1->val;
25                 l1=l1->next;
26             }
27             if(l2)
28             {
29                 carry+=l2->val;
30                 l2=l2->next;
31             }
32 
33             pre->next=new ListNode(carry%10);
34             carry/=10;
35             pre=pre->next;
36         }    
37 
38         if(carry==1)
39             pre->next=new ListNode(1);
40         
41         return nList->next;
42     }
43 };

方法二:参考数组的做法,先找出较长的,然后更新较长链表上结点的值。参考LeetCode上的讨论

 1 /**
 2  * Definition for singly-linked list.
 3  * struct ListNode {
 4  *     int val;
 5  *     ListNode *next;
 6  *     ListNode(int x) : val(x), next(NULL) {}
 7  * };
 8  */
 9 class Solution {
10 public:
11     ListNode *addTwoNumbers(ListNode *l1, ListNode *l2) 
12     {
13         int flag=0;
14         int sum=0;
15         ListNode *pointer1=l1;
16         ListNode *pointer2=l2;
17         ListNode *result=NULL;
18         while(pointer1&&pointer2)
19         {
20             pointer1=pointer1->next;
21             pointer2=pointer2->next;
22         }
23         if(pointer1==NULL)
24             result=l2;
25         else
26             result=l1;
27 
28         ListNode *nList=result;
29 
30         while(l1||l2)
31         {
32             sum=(l1?l1->val:0)+(l2?l2->val:0)+flag;
33             flag=sum/10;
34             result->val=sum%10;
35             l1?l1=l1->next:l1;
36             l2?l2=l2->next:l2;
37             result->next?result=result->next:result;    //值得注意必须先判断存在,
38         }                                               //思考,若存在进位,和下面的代码会产生什么后果
39         if(flag==1)
40         {
41             result->next=new ListNode(1);
42         }
43 
44         return nList;
45     }
46 };

 

posted @ 2017-06-19 10:22  王大咩的图书馆  阅读(212)  评论(0编辑  收藏  举报