題目來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/add-two-numbers
題目描述
給你兩個 非空 的連結清單,表示兩個非負的整數。它們每位數字都是按照 逆序 的方式存儲的,并且每個節點隻能存儲 一位 數字。
請你将兩個數相加,并以相同形式傳回一個表示和的連結清單。
你可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。
示例:

輸入: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
題目資料保證清單表示的數字不含前導零
解題思路
此題主要考查的是連結清單的基礎操作,思路十分的明确,連結清單的基礎操作就不加贅述了。
根據題目所述,數字是以連結清單的形式逆序存放的,這樣一來,逆序的問題也不需要考慮了,餘下的問題僅剩兩個:
1、高位補0的問題
由于數字的位數不一定相等,是以連結清單的長度也不一定相等,需要在計算完連結清單共同相加的部分後,會有一條連結清單多出一部分,需要将多出的這部分連接配接到新的連結清單上去。
2、進位問題
這裡設定了一個标志位作為進位,每次求和時候會加入标志位,并且求和完畢後更新标志位。
重做這道題的原因是當時在學習Python,是以使用了Python寫了一遍這題,熟悉了一下Python的文法。
源碼展示
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
root = ListNode(l1.val + l2.val)
root.next = None
fa = root
if root.val >= 10:
root.val = root.val % 10
jw = 1
else:
jw = 0
i = 1
p1 = l1.next
p2 = l2.next
while p1 != None and p2 != None:
if p1.val + p2.val + jw >= 10:
node = ListNode((p1.val + p2.val + jw) % 10)
jw = 1
else:
node = ListNode(p1.val + p2.val + jw)
jw = 0
fa.next = node
fa = node
p1 = p1.next
p2 = p2.next
i += 1
if p1 == None:
fa.next = p2
else:
fa.next = p1
p = fa.next
while jw == 1:
if p != None:
p.val += 1
if (p.val >= 10):
p.val = p.val % 10
else:
jw = 0
else:
p = ListNode(1)
p.next=None
fa.next=p
break
if p.next != None:
fa=p
p = p.next
else:
fa=p
p = None
return root