【Leetcode】两数相加

题目链接:两数相加


题意:给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

题解:每次加两个链表当前节点的值,有进位就标记一下,下次加就进位。(这个题比较好的是只进1位)

最开始写了一个十分冗余的代码。。遍历至其中一个为空就跳出来。然后找不空的链表继续做处理。

后面做了一个优化,在循环里去判断链表是不是为空。处理到当前链表是空的,值更新为0,这个链表就不往下走了。

还有一个地方要注意,最后链表全部加完后要判断是不是还有进位,还有进位的话要处理的。

代码:

 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         ListNode *ans = new ListNode(0);
13         ListNode *res = ans;
14 
15         int carry = 0;  //进位
16         int num = 0,num1 = 0,num2 = 0;
17         
18         while(l1 || l2 || carry){
19             if(l1){
20                 num1 = l1->val;
21                 l1 = l1->next;
22             }
23             else    num1 = 0;
24             
25             if(l2){
26                 num2 = l2->val;
27                 l2 = l2->next;
28             }
29             else    num2 = 0;
30             
31             num = num1 + num2 + carry;
32             if(num >= 10){
33                 num -= 10;
34                 carry = 1;
35             }
36             else    carry = 0;
37 
38             res->next = new ListNode(num);
39             res = res->next;
40         }
41         
42         return ans->next;
43         
44     }
45 };
原文地址:https://www.cnblogs.com/Asumi/p/12513750.html