VIRTUALS

the virtual labs for the virtuals

0%

LeetCode 9. 两数相加

摘要:

题目

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 $0$ 之外,这两个数都不会以 $0$ 开头。

示例:

输入: (2 -> 4 -> 3) + (5 -> 6 -> 4)
输出: 7 -> 0 -> 8
原因: 342 + 465 = 807


朴素解法

我们需要创建一个新的链表作为相加后的返回对象,而且在新的链表构造过程中,其头结点需要不断移动,从而导致无法返回整个链表。

我们可以定义独立于新链表的一个 超级头结点 ,让其指向新的链表。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
int carry = 0; //进位
ListNode pre = new ListNode(0); //超级头结点
ListNode cur = pre; //超级头结点指向新的链表
while (l1 != null || l2 != null) {
int value1 = l1 == null ? 0 : l1.val;
int value2 = l2 == null ? 0 : l2.val;
int sum = value1 + value2 + carry;

if (sum >= 10) carry = 1;
else carry = 0;
cur.next = new ListNode(sum % 10);
cur = cur.next;
if (l1 != null) l1 = l1.next;
if (l2 != null) l2 = l2.next;
}
if (carry == 1) cur.next = new ListNode(1);
return res.next; //返回超级头结点的后面
}
}

原题链接: LeetCode 9. 两数相加