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 };