题目描述
两个非空链表,表示两个非负整数。数字以相反的顺序存储,每个节点包含一个数字。将两个数字相加,返回一个新的链表。
假设除了数字 0 之外,这两个数都没有前导零。
Example:
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8
Explanation: 342 + 465 = 807
解题思路
这道题目算是非常经典的一道题目了,要点就是设置一个跟踪变量 ( carry
),来跟踪当前位数的数字之和是否需要进位。
一般情况下,都会设置一个新的链表头 ( dummyHead
) 来指向需要返回的链表,然后定义一个 curr
节点跟踪当前节点的位置。
参考代码
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode dummyHead = new ListNode(0); // 设置返回链表的头节点
ListNode node1 = l1, node2 = l2, curr = dummyHead;
int carry = 0;
while (node1 != null || node2 != null) {
int x = (node1 != null) ? node1.val : 0;
int y = (node2 != null) ? node2.val : 0;
int sum = carry + x + y;
carry = sum / 10;
curr.next = new ListNode(sum % 10);
curr = curr.next;
if (node1 != null) node1 = node1.next;
if (node2 != null) node2 = node2.next;
}
if (carry > 0) {
curr.next = new ListNode(carry);
}
return dummyHead.next;
}
拓展
原题解最后说了这样的一句话:
What if the the digits in the linked list are stored in non-reversed order? For example:
( 3 → 4 → 2 ) + ( 4 → 6 → 5 ) = 8 → 0 → 7
如果链表中的数字以非反转顺序存储怎么办?
首先想到的就是反转链表:
先把 l1
和 l2
反转,最后返回的时候,再把 dummyHead.next
反转。
参考代码(拓展)
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
// 链表反转
l1 = reverseList(l1);
l2 = reverseList(l2);
ListNode dummyHead = new ListNode(0); // 设置返回链表的头节点
ListNode node1 = l1, node2 = l2, curr = dummyHead;
int carry = 0;
while (node1 != null || node2 != null) {
int x = (node1 != null) ? node1.val : 0;
int y = (node2 != null) ? node2.val : 0;
int sum = carry + x + y;
carry = sum / 10;
curr.next = new ListNode(sum % 10);
curr = curr.next;
if (node1 != null) node1 = node1.next;
if (node2 != null) node2 = node2.next;
}
if (carry > 0) {
curr.next = new ListNode(carry);
}
return reverseList(dummyHead.next);
}
private ListNode reverseList(ListNode head) {
ListNode prev = null;
ListNode curr = head;
ListNode next;
while (curr != null) {
next = curr.next;
curr.next = prev;
prev = curr;
curr = next;
}
return prev;
}