Skip to content

2. 两数相加

题目链接:https://leetcode.cn/problems/add-two-numbers/

代码

ts
/**
 * Definition for singly-linked list.
 * class ListNode {
 *     val: number
 *     next: ListNode | null
 *     constructor(val?: number, next?: ListNode | null) {
 *         this.val = (val===undefined ? 0 : val)
 *         this.next = (next===undefined ? null : next)
 *     }
 * }
 */

function addTwoNumbers(l1: ListNode | null, l2: ListNode | null): ListNode | null {
    let list = new ListNode();
    let head = list;
    let carry = 0;
    while (l1 || l2 || carry) {
        if (l1) {
            carry += l1.val;
            l1 = l1.next;
        }
        if (l2) {
            carry += l2.val;
            l2 = l2.next;
        }
        list = list.next = new ListNode(carry % 10);
        carry = Math.floor(carry / 10);
    }
    return head.next;
};

思路

使用链表模拟加法,处理进位:

  1. 创建哑节点 head 作为结果链表的起始点
  2. 初始化 carry = 0 用于存储进位
  3. 遍历两个链表,直到两个链表都为空且没有进位:
    • 将当前节点的值和进位相加到 carry
    • 创建新节点,值为 carry % 10(当前位的值)
    • 更新进位 carry = Math.floor(carry / 10)
  4. 返回 head.next(跳过哑节点)

关键点

  • 使用 carry 变量统一处理两个链表节点值和进位

  • 循环条件是 l1 || l2 || carry,确保处理完所有节点和最后的进位

  • 使用哑节点简化链表操作,避免特殊处理头节点

  • 时间复杂度 O(max(m,n)),其中 mn 分别是两个链表的长度

  • 空间复杂度 O(max(m,n)),结果链表的长度