LeetCode#2两数相加
题目链接
一道用链表存储每一位数,然后按位相加的题目,遍历起来没有任何难度,主要是需要注意循环结束的条件:
- 第一个和第二个链表都到了末尾(都到了末尾才相当于把两个‘数’都遍历了一遍,只有一个指向nullptr时不行的)
- 自定义的进位位需要为0(因为两个数相加可能会产生进位的情况,如果我们只考虑是否把两个已知链表遍历完了,那么可能最后会少一位)
其他就没什么难点了,无非是处理链表遍历的时候,如何声明新的节点和访问next节点(要避免不越界)
附代码: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
42
43
44
45
46
47
48
49
50
51
52
53/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* ans = nullptr;//我们返回的答案head节点,声明的时候可以先声明为空
int inc = 0;//记录是否有进位
int val = 0;//记录当天两个链表相加的值
ListNode* cur = nullptr;//遍历时需要用到的temp节点,也可以看作是链表中的tail节点吧?
while(l1 != nullptr || l2 != nullptr || inc != 0)
{
int x1,x2;
if(l1 == nullptr)//如果其中一个链表已经到了末尾(空节点),直接将val看作0即可
x1 = 0;
else
{
x1 = l1 -> val;
l1 = l1 -> next;//访问这个链表的下一个节点
}
if(l2 == nullptr)//同上
x2 = 0;
else
{
x2 = l2 -> val;
l2 = l2 -> next;
}
val = x1 + x2 + inc;//别忘了处理进位
inc = val/10;
val %= 10;
if(ans == nullptr)//在第一个head节点需要额外单独处理一下
{
ans = new ListNode(val);
cur = ans;
}
else
{
cur -> next = new ListNode(val);//相当于处理tail节点
cur = cur -> next;
}
}
return ans;
}
};