Skip to content

两数相加 II

约 422 字大约 1 分钟

2025-03-01

445. 两数相加 II

给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。

你可以假设除了数字 0 之外,这两个数字都不会以零开头。

示例1:

img.png

输入:l1 = [7,2,4,3], l2 = [5,6,4]
输出:[7,8,0,7]

示例2:

输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[8,0,7]

示例3:

输入:l1 = [0], l2 = [0]
输出:[0]

提示:

  • 链表的长度范围为 [1, 100]
  • 0 <= node.val <= 9
  • 输入数据保证链表代表的数字无前导 0

进阶:如果输入链表不能翻转该如何解决?

反转链表,迭代写法

public class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        // 反转输入的链表,把低位放在前面
        l1 = reverseList(l1);
        l2 = reverseList(l2);

        // 虚拟节点
        ListNode head = new ListNode(0);
        // 构建链表的节点
        ListNode current = head;
        
        int carry = 0;
        // 逐位相加,先加低位
        while (l1 != null || l2 != null || carry != 0) {
            int sum = carry;
            if (l1 != null) {
                sum += l1.val;
                l1 = l1.next;
            }
            if (l2 != null) {
                sum += l2.val;
                l2 = l2.next;
            }

            carry = sum / 10;
            // 注意新链表中cur没有next节点,所以需要先构造,再前进。
            current.next = new ListNode(sum % 10);
            current = current.next;
        }

        // 反转结果链表
        return reverseList(head.next);
    }

    // 反转链表函数
    private ListNode reverseList(ListNode head) {
        ListNode prev = null;
        ListNode current = head;

        while (current != null) {
            ListNode nextTemp = current.next;
            
            current.next = prev;
            prev = current;
            current = nextTemp;
        }

        return prev;
    }
}
  • 时间复杂度:O(n),其中 nl1 长度和 l2 长度的最大值。
  • 空间复杂度:O(1)。返回值不计入。