1. 题目来源
链接:lc2. 两数相加
2. 题目解析
方法一:模拟
就是模拟竖式加法。简单处理下进位就行了。在此需要注意链表问题的基本操作:虚拟头节点的使用。 建立虚拟头结点就不需要判断当前点是头一个点了,凡是需要特判当前点是第一个点的问题都可以使用虚拟头结点。
其次,关于链表问题,还有就是尾指针也很常用,保证 dummy
节点不变的情况下,记录尾指针能实现快速的尾插。这样最后就能直接返回 dummy->next
节点作为答案的头结点了。
一定需要注意尾插后要更新尾指针…即:cur = cur->next = new ListNode(t % 10);
。在这犯了这个错误,引以为戒~
时间复杂度:
O
(
n
)
O(n)
O(n)
空间复杂度:
O
(
n
)
O(n)
O(n)
代码:
/**
* 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) {
auto dummy = new ListNode(-1), cur = dummy;
int t = 0;
while (l1 || l2 || t) {
if (l1) t += l1->val, l1 = l1->next;
if (l2) t += l2->val, l2 = l2->next;
cur = cur->next = new ListNode(t % 10);
t /= 10;
}
return dummy->next;
}
};