分析
- 初始化
- 使用一个虚拟头节点
dummy
,方便操作结果链表
- 用指针
cur
指向结果链表的当前尾部
- 定义一个变量
sum
用于存储当前位的加和(包括进位)
- 逐位相加
- 遍历链表
l1
和 l2
,对每一位的值进行相加,同时加上进位 sum
- 取个位数字作为当前位的值,新建节点添加到结果链表中
- 更新
sum
为十位上的进位。
- 处理进位
- 当
l1
和 l2
遍历完后,如果还有进位 sum > 0
,需要额外创建一个节点存储进位
时间复杂度
时间复杂度 O(max(n, m))
,n
和 m
分别为链表 l1
和 l2
的长度,需要遍历两链表的所有节点
空间复杂度
空间复杂度为 O(max(n, m))
C++代码
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
|
class Solution
{
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2)
{
int sum = 0; // 用于存储每个位的和以及进位
ListNode* dummy = new ListNode(-1); // 虚拟头节点
ListNode* cur = dummy; // 指向结果链表的当前尾部
// 遍历链表 l1 和 l2
while (l1 || l2 || sum)
{
// 如果 l1 或 l2 不为空,加上它们当前位的值
if (l1)
{
sum += l1->val;
l1 = l1->next; // 移动到下一位
}
if (l2)
{
sum += l2->val;
l2 = l2->next; // 移动到下一位
}
// 创建新节点存储当前位的值,并连接到结果链表
cur = cur->next = new ListNode(sum % 10);
// 更新进位
sum /= 10;
}
// 返回结果链表
return dummy->next;
}
};
|