链表-Add Two Numbers

第一版代码(很挫很罗嗦,不过是第一次做,记录一下成长的脚步!继续努力!)  

 1 /*struct ListNode {
 2      int val;
 3      struct ListNode *next;
 4 };*/
 5 
 6 typedef struct ListNode ListNode;
 7 
 8 struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
 9     ListNode *result = (ListNode *)malloc(sizeof(ListNode));
10     result->next = NULL;
11     ListNode *now = result;
12 
13     ListNode *p1 = l1;
14     ListNode *p2 = l2;
15     int carry = 0;
16 
17     while(p1&&p2)
18     {
19         ListNode *p = (ListNode *)malloc(sizeof(ListNode));
20         p->next = NULL;
21         int r = p1->val + p2->val + carry;
22         carry = r/10;   
23         p->val = r%10;
24         now->next = p;  
25         now = now->next;
26         p1 = p1->next;
27         p2 = p2->next;
28     }
29 
30     while(p1)
31     {
32         ListNode *p = (ListNode *)malloc(sizeof(ListNode));
33         p->next = NULL;
34         int r = p1->val + carry;
35         carry = r/10;   
36         p->val = r%10;
37         now->next = p;  
38         now = now->next;
39         p1 = p1->next;
40     }
41 
42     while(p2)
43     {
44         ListNode *p = (ListNode *)malloc(sizeof(ListNode));
45         p->next = NULL;
46         int r = p2->val + carry;
47         carry = r/10;   
48         p->val = r%10;
49         now->next = p;  
50         now = now->next;
51         p2 = p2->next;
52     }
53     if(carry)
54     {
55         ListNode *p = (ListNode *)malloc(sizeof(ListNode));
56         p->next = NULL;
57         p->val = carry;
58         now->next = p;  
59         now = now->next;
60     }
61 
62     return result->next;
63     
64 }

要注意返回的内容必须符合题目要求,一开始我直接返回了result,但是leetcode测试的时候会把空的头结点也输出,不符合题目要求。

要全面考虑问题,这题的特殊情况主要体现在进位部分,如999+1这种情况,还有就是两个数的位数可能会不同。

可以使用条件操作符对代码进行简化,简化版如下:

 1 void addTwoNumbers(struct ListNode* l1, struct ListNode* l2)
 2 {
 3     ListNode *result = (ListNode *)malloc(sizeof(ListNode));
 4     result->next = NULL;
 5     ListNode *now = result;
 6 
 7     ListNode *p1 = l1;
 8     ListNode *p2 = l2;
 9     int carry = 0;
10 
11     while(p1&&p2)
12     {
13         ListNode *p = (ListNode *)malloc(sizeof(ListNode));
14         p->next = NULL;
15         int r = p1->val + p2->val + carry;
16         carry = r/10;   //进位
17         p->val = r%10;
18         now->next = p;  //插入到result链表中
19         now = now->next;
20         p1 = p1->next;
21         p2 = p2->next;
22     }
23 
24     ListNode *p3 = p1?p1:p2;
25     while(p3)
26     {
27         ListNode *p = (ListNode *)malloc(sizeof(ListNode));
28         p->next = NULL;
29         int r = p3->val + carry;
30         carry = r/10;   //进位
31         p->val = r%10;
32         now->next = p;  //插入到result链表中
33         now = now->next;
34         p3 = p3->next;
35     }
36 
37     if(carry)
38     {
39         ListNode *p = (ListNode *)malloc(sizeof(ListNode));
40         p->next = NULL;
41         p->val = carry;
42         now->next = p;  //插入到result链表中
43         now = now->next;
44     }
45 
46 
47     Print(result->next);
48 
49 }

【待补充C++版本。。。】

posted on 2016-03-03 22:42  summerkiki  阅读(188)  评论(0编辑  收藏  举报