两数相加 II
约 422 字大约 1 分钟
2025-03-01
445. 两数相加 II
给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
示例1:
输入: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),其中 n 为 l1 长度和 l2 长度的最大值。
- 空间复杂度:O(1)。返回值不计入。