LeetCode題解——Add Two Numbers


題目

兩個數字求和,數字用鏈表表示,每一個結點代表一位。鏈表順序與數字順序相反,即表頭存放數字的最低位。

 

解法

分別遍歷兩個鏈表的每個結點,對兩個結點求和即可。要維護一個變量保存每次相加之后的進位。

更常見的,鏈表順序與數字順序相同,那么做一次鏈表逆序,求和之后再逆序回來即可。

 

代碼

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM