LeetCode 2 两数相加

链接:https://leetcode-cn.com/problems/add-two-numbers

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

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

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

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

这道题呢,简化了难度,因为链表的顺序就是我们平时计算两个数之和的顺序,都是从低位开始加。比如平时我们计算342+465,也是先计算2+5,对吧~

然后求的和变成一个新的结点,在组合新链表的时候,也不必采用头插法,因为返回的链表也是倒序哈哈哈。

要注意的有两个点,一个是有进位的情况,我们可以用一个变量来表示进位,进位就是sum/10,而结点的值是sum%10。

还有就是当链表长度不一样时,如果链表遍历到空了,我们把它的值记为0就好~

对了,不要忘记加上最后最后一步的进位噢,可以在while循环条件里设置,当carry为1时,继续再循环一次即可!

c++代码如下:

 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* l3 = new ListNode(-1);
13         auto dummy = l3;
14         int carry = 0;
15         
16         while(l1 || l2 || carry){
17             int p = l1 ? l1->val : 0;
18             int q = l2 ? l2->val : 0;
19             int sum = p + q + carry;
20             carry = sum / 10;
21             l3->next = new ListNode(sum % 10);
22             l3 = l3->next;
23             if(l1) l1 = l1->next;
24             if(l2) l2 = l2->next;
25         }
26         return dummy->next;
27     }
28 };
原文地址:https://www.cnblogs.com/hellosnow/p/12153295.html