題目:
兩個數字求和,數字用鏈表表示,每一個結點代表一位。鏈表順序與數字順序相反,即表頭存放數字的最低位。
解法:
分別遍歷兩個鏈表的每個結點,對兩個結點求和即可。要維護一個變量保存每次相加之后的進位。
更常見的,鏈表順序與數字順序相同,那么做一次鏈表逆序,求和之后再逆序回來即可。
代碼:
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 ListNode retHead(-1), *pr = &retHead, *p1 = NULL, *p2 = NULL; 13 int carry = 0; //保存每次結點求和之后的進位,用一個bool也可以 14
15 for(p1 = l1, p2 = l2; p1 != NULL && p2 != NULL; p1 = p1->next, p2 = p2->next) //p1 p2分別遍歷兩個鏈表 16 { 17 int sum = p1->val + p2->val + carry; 18 pr->next = new ListNode(sum % 10); //求和結果保存在新結點 19
20 pr = pr->next; //p2指向求和鏈表的尾結點 21 carry = sum / 10; 22 } 23
24 for(ListNode *p = (p1 == NULL ? p2 : p1); p != NULL; p = p->next) //處理兩個鏈表中未處理完的鏈表剩余節點 25 { 26 int sum = p->val + carry; 27 pr->next = new ListNode(sum % 10); 28
29 pr = pr->next; 30 carry = sum / 10; 31 } 32
33 if(carry != 0) //如果最后還有進位,必定是1 34 { 35 pr->next = new ListNode(carry); 36 } 37
38 return retHead.next; 39 } 40 };