2_Add Two Numbers --LeetCode

原题如下:

思路:在一个while中遍历两个链表,直到最长的链表为空,或者没有进位。每一步获取两个链表对应的结点的值a,b,然后相加a+b。如果上一步又进位,那就加a+b+1,若由于进位加1后还产生进位,则设置进位标识位为true。如果a+b大于9,也要设置进位标识为true。

 

代码如下:

 1 /**
 2  * Definition for singly-linked list.
 3  * struct ListNode {
 4  *     int val;
 5  *     ListNode *next;
 6  *     ListNode(int x) : val(x), next(NULL) {}
 7  * };
 8  */
 9 class Solution {
10 public:
11     ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
12         //异常输入验证
13         if(NULL==l1 && NULL==l2)
14         {
15             ListNode* LN = (ListNode*)malloc(sizeof(ListNode));
16             LN->val = 0;
17             LN->next = NULL;
18             return LN;
19         }
20         
21         if(NULL == l2 && NULL !=l1)
22             return l1;
23         
24         if(NULL == l1 && NULL !=l2)
25             return l2;
26         
27         bool carry = false; //进位标识符
28         ListNode* p = l1,*q = l2,* L = NULL,*s = NULL,*pl;
29         
30         //创建头结点,后面会删除掉。
31         if(!(L = (ListNode*)malloc(sizeof(ListNode))))
32            return L;
33         L->val = 0;
34         L->next = NULL;
35         pl = L;
36         while(p!=NULL || q!=NULL || carry)
37         {
38             
39             int pos1=0,pos2=0,remain=0, sum = 0;
40             
41             //以下两个if是获取两个链表中的值
42             if(p!=NULL)
43             {
44                 pos1 = p->val;
45                 p=p->next;
46             }  
47             
48             if(q!=NULL)
49             {
50                 pos2 = q->val;
51                 q=q->next;
52             }
53             
54             //相加
55             sum = pos1+pos2;
56             //求余
57             remain = sum%10;
58             //创建结点
59             if(!(s = (ListNode*)malloc(sizeof(ListNode))))
60                 return s;
61             //如果上一步又进位
62             if(carry){
63                 //再次判断进位后是否还进位
64                 if(remain+1>9){
65                     s->val=0;
66                     carry = true;
67                 }else{
68                     s->val = remain+1;
69                     carry = false;
70                 }
71                 
72             }else
73                 s->val=remain;
74             //添加结点到链表中
75             s->next = NULL;
76             pl->next = s;
77             pl = s;
78             
79             //判断是否进位
80             if(sum>9)
81                 carry = true; 
82         }
83       
84         //删除结点
85         pl = L;
86         L = L->next;
87         free(pl);
88         
89         return L;
90     }
91 };

 

posted @ 2018-01-23 12:23  HOU_JUN  阅读(146)  评论(0编辑  收藏  举报