Live2D

LeetCode之Add Two Numbers

Add Two Numbers

方法一:

  考虑到有进位的问题,首先想到的思路是:

  先分位求总和得到 totalsum,然后再将totalsum按位拆分转成链表;

 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%通过;

  这就奇怪了,为什么运算得好好的,遇到这组测试就偏偏出了问题。输出中间结果一看,才知道是 int 型溢出了。因此将变量 sum 和变量 i 都从int型换成 long long 型。这下总该行了吧?

  没想到呀,还有更长的测试数据。

  静下心来想一想,既然输入的数据是链表的形式,必然会有超过 long long 长度的情况。此解决方案存在巨大的隐患!!!

方法二:

  换一种思维方式,只需要关注同等位的相加,进位1或者不进位。问题很简单嘛,同等位相加加入到新链表中,若有进位则记录到下次同等位的相加中....

 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     }

 

 基础补充

  回顾下链表的创建个输出,以头结点不存内容为例。

1、链表的创建:

 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 }

2、打印链表:

 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 }

 

posted @ 2018-08-23 18:14  Christal_R  阅读(263)  评论(0编辑  收藏  举报