【LeetCode】002 Add Two Numbers

题目:LeetCode 002 Add Two Numbers

题意:给定表达非负数的两个链表,这些数字按照反向顺序存储,每个节点包含一个单独的数字,将这两个数相加,返回一个新链表。

 

样例:

Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8

 

链表每个节点的结构:

1 struct ListNode {
2     int val;
3     ListNode *next;
4     ListNode(int x) : val(x), next(NULL) {}
5 };

 

思路:

按位相加,要考虑进位。

 

学习生成链表的方法:

1 ListNode *ans = new ListNode(0), *ptr = ans;
2 t->next = new ListNode(val);
3 t = t->next;
4 return ans->next;

 

代码1:利用数组

因为对链表特别生疏,所以尝试先将链表转成数组,然后得到结果之后再重新赋值到链表中。 但是生成链表还是参考了别人的代码:链表第一个节点只是用来传递指针的。

 1 class Solution {
 2 public:
 3     ListNode* addTwoNumbers(ListNode *l1, ListNode *l2) {
 4         int a[20000], b[20000], na = 0, nb = 0;
 5         memset(a, 0, sizeof(a));
 6         memset(b, 0, sizeof(b));
 7         while(l1)
 8         {
 9             a[na++] = l1->val;
10             l1 = l1->next;
11         }
12         while(l2)
13         {
14             b[nb++] = l2->val;    
15             l2 = l2->next;
16         }
17         na = max(na, nb);
18         for(int i = 0; i < na || i < nb; i++)
19         {
20             a[i] += b[i];
21             a[i+1] += a[i]/10;
22             a[i] %= 10;
23         }
24         if(a[na]) na++;
25 
26         ListNode *ans = new ListNode(0);
27         l1 = ans;
28         for(int i = 0; i < na; i++)
29         {
30             l1->next = new ListNode(a[i]);
31             l1 = l1->next;
32         }
33         return ans->next;
34     }
35 };

 

用链表直接做,要考虑到,如果两个链表不一样长,就会出现可能访问到链表某个节点的val为空的情况,所以要分情况进行处理。 另外,在别人的代码中看到有人说,如果其中一个链表短,访问到尾部的时候可以将另外长的链表接在返回的链表结尾,但是有个反例:

Input: (0 -> 1) + (9 -> 9 -> 9 –> 9) 或者有更多个9,需要连续进位的情况。

 

 1 class Solution {
 2 public:
 3     ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
 4         int flag = 0;
 5         ListNode* ans = new ListNode(0);
 6         ListNode* t = ans;
 7 
 8         while(l1 != NULL || l2 != NULL)
 9         {
10             int val;
11             if(!l1)
12             {                
13                 if(flag == 0)
14                 {
15                     t->next = l2;
16                     break;
17                 }
18                 val = l2->val + flag;
19                 l2 = l2->next;
20             }
21 
22             else if(!l2)
23             {
24                 if(flag == 0)
25                 {
26                     t->next = l1;
27                     break;
28                 }
29                 val = l1->val + flag;
30                 l1 = l1->next;
31             }
32             
33             else
34             {
35                 val = l1->val + l2->val + flag;
36                 l1 = l1->next;
37                 l2 = l2->next;
38             }
39             flag = val/10;
40             val %= 10;
41             t->next = new ListNode(val);
42             t = t->next;
43         }
44 
45         if(flag) t->next = new ListNode(1);
46         return ans->next;
47     }
48 };

 

posted @ 2015-04-26 16:58  二喵de喵  阅读(149)  评论(0编辑  收藏  举报