考慮到有進位的問題,首先想到的思路是:測試
先分位求總和獲得 totalsum,而後再將totalsum按位拆分轉成鏈表;spa
1 ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { 2 int sum = 0; 3 int i = 1; 4 while(l1 != NULL && l2 != NULL) 5 { 6 sum += i*(l1->val + l2->val); 7 i *= 10; 8 l1 = l1->next; 9 l2 = l2->next; 10 } 11 while(l1 != NULL) 12 { 13 sum += i * (l1->val); 14 i *= 10; 15 l1 = l1->next; 16 } 17 while(l2 != NULL) 18 { 19 sum += i * (l2->val); 20 i *= 10; 21 l2 = l2->next; 22 } 23 //fen 24 ListNode *head = new ListNode(0); 25 ListNode *p = head; 26 if(sum == 0) return head; 27 while(sum!=0) 28 { 29 p->next = new ListNode(sum%10); 30 p = p->next; 31 sum /= 10; 32 } 33 return head->next; 34 }
修修改改總算是經過了基本測試,但並非100%經過;code
這就奇怪了,爲何運算得好好的,遇到這組測試就恰恰出了問題。輸出中間結果一看,才知道是 int 型溢出了。所以將變量 sum 和變量 i 都從int型換成 long long 型。這下總該行了吧?blog
沒想到呀,還有更長的測試數據。ip
靜下心來想想,既然輸入的數據是鏈表的形式,必然會有超過 long long 長度的狀況。此解決方案存在巨大的隱患!!!ci
換一種思惟方式,只須要關注同等位的相加,進位1或者不進位。問題很簡單嘛,同等位相加加入到新鏈表中,如有進位則記錄到下次同等位的相加中....leetcode
1 ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { 2 ListNode *head = new ListNode(0); 3 ListNode *p = head; 4 int sum = 0; 5 while(l1 != NULL || l2 != NULL) 6 { 7 if(l1 != NULL) 8 { 9 sum += (l1->val); 10 l1 = l1->next; 11 } 12 if(l2 != NULL) 13 { 14 sum += (l2->val); 15 l2 = l2->next; 16 } 17 p->next = new ListNode(sum%10); 18 p = p->next; 19 sum /= 10; 20 } 21 if(sum != 0) 22 p->next = new ListNode(sum); 23 return head->next; 24 }
回顧下鏈表的建立個輸出,以頭結點不存內容爲例。get
一、鏈表的建立:io
1 ListNode* CreatList() 2 { 3 ListNode *head = new ListNode(0); 4 ListNode *p = head; 5 int x = 1; 6 while(1) 7 { 8 cin>>x; 9 if(x == -1) 10 break; 11 p->next = new ListNode(x); 12 p = p->next; 13 } 14 return head; 15 }
二、打印鏈表:class
1 void PrintList(ListNode *head) 2 { 3 ListNode* p = head; 4 while(p->next!=NULL) 5 { 6 p = p->next; 7 cout<<p->val<<"->"; 8 } 9 cout<<endl; 10 }