1. 程式人生 > >2_Add Two Numbers --LeetCode

2_Add Two Numbers --LeetCode

leetcode 創建 圖片 style image code number 大於 分享圖片

原題如下:

技術分享圖片

思路:在一個while中遍歷兩個鏈表,直到最長的鏈表為空,或者沒有進位。每一步獲取兩個鏈表對應的結點的值a,b,然後相加a+b。如果上一步又進位,那就加a+b+1,若由於進位加1後還產生進位,則設置進位標識位為true。如果a+b大於9,也要設置進位標識為true。

代碼如下:

 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(NULL==l1 && NULL==l2) 14 { 15 ListNode* LN = (ListNode*)malloc(sizeof(ListNode)); 16 LN->val = 0; 17 LN->next = NULL;
18 return LN; 19 } 20 21 if(NULL == l2 && NULL !=l1) 22 return l1; 23 24 if(NULL == l1 && NULL !=l2) 25 return l2; 26 27 bool carry = false; //進位標識符 28 ListNode* p = l1,*q = l2,* L = NULL,*s = NULL,*pl;
29 30 //創建頭結點,後面會刪除掉。 31 if(!(L = (ListNode*)malloc(sizeof(ListNode)))) 32 return L; 33 L->val = 0; 34 L->next = NULL; 35 pl = L; 36 while(p!=NULL || q!=NULL || carry) 37 { 38 39 int pos1=0,pos2=0,remain=0, sum = 0; 40 41 //以下兩個if是獲取兩個鏈表中的值 42 if(p!=NULL) 43 { 44 pos1 = p->val; 45 p=p->next; 46 } 47 48 if(q!=NULL) 49 { 50 pos2 = q->val; 51 q=q->next; 52 } 53 54 //相加 55 sum = pos1+pos2; 56 //求余 57 remain = sum%10; 58 //創建結點 59 if(!(s = (ListNode*)malloc(sizeof(ListNode)))) 60 return s; 61 //如果上一步又進位 62 if(carry){ 63 //再次判斷進位後是否還進位 64 if(remain+1>9){ 65 s->val=0; 66 carry = true; 67 }else{ 68 s->val = remain+1; 69 carry = false; 70 } 71 72 }else 73 s->val=remain; 74 //添加結點到鏈表中 75 s->next = NULL; 76 pl->next = s; 77 pl = s; 78 79 //判斷是否進位 80 if(sum>9) 81 carry = true; 82 } 83 84 //刪除結點 85 pl = L; 86 L = L->next; 87 free(pl); 88 89 return L; 90 } 91 };

2_Add Two Numbers --LeetCode