Featured image of post Add Two Numbers

Add Two Numbers

2. 两数相加

分析

  1. 初始化
    • 使用一个虚拟头节点 dummy,方便操作结果链表
    • 用指针 cur 指向结果链表的当前尾部
    • 定义一个变量 sum 用于存储当前位的加和(包括进位)
  2. 逐位相加
    • 遍历链表 l1l2,对每一位的值进行相加,同时加上进位 sum
    • 取个位数字作为当前位的值,新建节点添加到结果链表中
    • 更新 sum 为十位上的进位。
  3. 处理进位
    • l1l2 遍历完后,如果还有进位 sum > 0,需要额外创建一个节点存储进位

时间复杂度

时间复杂度 O(max(n, m))nm 分别为链表 l1l2 的长度,需要遍历两链表的所有节点

空间复杂度

空间复杂度为 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;
    }
};
Built with Hugo
Theme Stack designed by Jimmy