LeetCode刷题之旅(2)--两数相加(中等题)

没有简单的题目,或者说,再简单的题目,只要追求极致,都会要花心思。好好加油吧<->

题目:两数之和

1
2
给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。
你可以假设除了数字0之外,这两个数字都不会以零开头。
1
2
3
4
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

解题思路:

方法:

1、判断了l1和l2是否存在,如果存在,就可以累加,然后将累加后产生的进位存起来
2、要考虑到两个表长度不一样,所以,在其中一个表已经空了以后,就要将进位的值消耗掉,如果两个表都为空了以后,进位还不为0,则最后一位必为1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {

ListNode* result=new ListNode(0);//初始化第一个至为0

ListNode* tmp=result;//使用tmp记录每次计算了以后的余数,比如6+5=11 tmp=1
int sum_jinwei=0;//这个变量起到两个作用,一是用作l1与l2的相加的值sum,二是作为jinwei的值例如8+7=17,jinwei=1
while(l1||l2)
{
if(l1)
{
sum_jinwei=sum_jinwei+l1->val;
l1=l1->next;
}
if(l2)
{
sum_jinwei=sum_jinwei+l2->val;
l2=l2->next;
}
tmp->next=new ListNode(sum_jinwei%10);//tmp->next就记录余数,也就是最后显示的值
sum_jinwei=sum_jinwei/10;//此时sum_jinwei就起到了携带进位的任务
tmp=tmp->next;
}
if(sum_jinwei==1)
{
tmp->next=new ListNode(1);//当sum_jinwei==1的时候就证明最高位必然为1
}
return result->next;
}
};

执行用时:24 ms
您的支持将鼓励我继续创作!