給你兩個 非空 的鏈表,表示兩個非負的整數。它們每位數字都是按照 逆序 的方式存儲的,並且每個節點只能存儲 一位 數字。
請你將兩個數相加,並以相同形式返回一個表示和的鏈表。
你可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。
示例 1:
輸入:l1 = [2,4,3], l2 = [5,6,4]
輸出:[7,0,8]
解釋:342 + 465 = 807.
示例 2:
輸入:l1 = [0], l2 = [0]
輸出:[0]
示例 3:
輸入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
輸出:[8,9,9,9,0,0,0,1]
提示:
- 每個鏈表中的節點數在範圍
[1, 100]
內 0 <= Node.val <= 9
- 題目數據保證列表表示的數字不含前導零
這題用python寫真的很方便。。看了下官方思路是逐位加,關鍵在於進位。我的就是很直接的取數相加再保存。
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
def getNum(l: Optional[ListNode]) -> int:
cnt = num = 0
while l:
num += l.val * 10 ** cnt
cnt += 1
l = l.next
return num
ans = str(getNum(l1) + getNum(l2))[::-1]
l3 = p = ListNode(int(ans[0]))
for i in ans[1:]:
node = ListNode(int(i))
p.next = node
p = p.next
return l3
用官方題解的思路寫了個遞歸:
class Solution:
def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode], carry = 0) -> Optional[ListNode]:
if l1 is None and l2 is None: # 遞歸邊界 l1和l2都是空節點
return ListNode(carry) if carry else None
if l1 is None: # l1爲空,l2不爲空
l1, l2 = l2, l1 # 保證l1不爲空,簡化代碼
carry += l1.val + (l2.val if l2 else 0)
l1.val = carry % 10 # 在原鏈表操作
l1.next = self.addTwoNumbers(l1.next, l2.next if l2 else None, carry // 10) # 進位
return l1