LeetCode之Add Two Numbers

Add Two Numbers

方法一:

  考慮到有進位的問題,首先想到的思路是:測試

  先分位求總和獲得 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 }
相關文章
相關標籤/搜索