Question 2.
You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.
You may assume the two numbers do not contain any leading zero, except the number 0 itself.
Example:
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8
Explanation: 342 + 465 = 807.
題目分析
tag
類別是 linked list。
題目
兩個逆序鏈表存儲兩個正整數,求和并用同樣的方式返回。
思路
# Definition for singly-linked list.
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
題目要求返回一個單向加和鏈表,第一個思路是盡可能回歸到熟悉的整數求和。
- 將兩個單向鏈表表示的整數轉換成真正的整數,求和,再逆向轉換為逆序鏈表。
- 前面的思路雖然熟悉,但消耗了很多資源在單向鏈表和整數的轉化上。借助整數相加的思路,而不是真正轉換成整數求和是正確的方向。從個位開始對應位置相加,直到兩個單向鏈表都沒有數字,就可以生成答案,這里要注意的是要有一個變量記錄進位。
以題目例子來推演:
l1: (2 -> 4 -> 3)
l2: (5 -> 6 -> 4)
個位開始,l1 的個位是 2,l2 的個位是 5,2 + 5 = 7,所以最終結果的個位是 7, 無進位;
十位繼續,l1 的十位是 4,l2 的十位是 6,4 + 6 = 10,所以最終結果的個位是 0, 有進位;
百位繼續,l1 的百位是 3,l2 的百位是 4,3 + 4 = 7,加上進位 1 等于 8,所以最終結果的百位是 8, 無進位;
千位繼續,l1 無千位,l2 無千位,結束,最終返回是 (7 -> 0 -> 8)
python
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
def add_two_numbers(l1: ListNode, l2: ListNode) -> ListNode:
# 標記特殊值為單向鏈表起始位置,這樣后續才能生產單向鏈表其他節點
l = ListNode(-1)
# 標記頭,返回 ListNode 的起始位置
head = l
# 進位值
carry = 0
# 如果 l1 或者 l2 或者進位有值,則返回鏈表繼續生成
while l1 or l2 or carry:
# 當前數字位初始值是之前的進位,當前進位初始值為 0
total, carry = carry, 0
# l1 存在則當前數字位值相加
if l1:
total += l1.val
l1 = l1.next
# l2 存在則當前數字位值相加
if l2:
total += l2.val
l2 = l2.next
# 當前數字位值相加總和大于 9,則需要進位
if total > 9:
total -= 10
carry = 1
# 根據當前數字位值生成單向鏈表節點
l.next = ListNode(total)
l = l.next
# 返回 ListNode 的起始位置
return head.next
java
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public listNode solution(listNode l1, listNode l2) {
listNode l = new listNode(-1);
listNode head = l;
int carry = 0;
while (l1 != null || l2 != null || carry != 0) {
int total = carry;
carry = 0;
if (l1 != null) {
total += l1.val;
l1 = l1.next;
}
if (l2 != null) {
total += l2.val;
l2 = l2.next;
}
if (total > 9) {
total -= 10;
carry = 1;
}
l.next = new listNode(total);
l = l.next;
}
return head.next;
}