# 計算單鏈表長度
length =0if
not l:
return
0else
:while l:
length +=
1 l = l.
next
return length
class
solution
:def
addtwonumbers
(self, l1: listnode, l2: listnode)
-> listnode:
length1 = getlength(l1)
length2 = getlength(l2)
flag =
false
if length1 > length2:
# 保持l2為長鍊錶
l3 = l1
l1 = l2
l2 = l3
l3 = l2 # 直接在l2上相加,l3指向l2
if length1 == length2:
# 當長度相同時
while l1.
next
:# 為了防止產生最高位進製,新增結點時指標丟失,用next
if flag:
l2.val +=
1 flag =
false
l2.val += l1.val
if l2.val >9:
l2.val -=
10 flag =
true
l1 = l1.
next
l2 = l2.
next
if flag:
# 如果向最高位進製
l2.val +=
1 flag =
false
l2.val += l1.val
if l2.val >9:
l2.val -=
10 flag =
true
if flag:
# 最高位向下一位進製(新增結點)
l2.next
= listnode(1)
else
:# l2長時
while l1:
# 計算公共部分
if flag:
l2.val +=
1 flag =
false
l2.val += l1.val
if l2.val >9:
l2.val -=
10 flag =
true
l1 = l1.
next
l2 = l2.
next
while l2.
next
:# 計算l2多餘部分,同樣,為了防止新增節點時指標丟失,用next
if flag:
l2.val +=
1 flag =
false
if l2.val >9:
l2.val -=
10 flag =
true
l2 = l2.
next
if flag:
# 向最高位進製
l2.val +=
1 flag =
false
if l2.val >9:
l2.val -=
10 flag =
true
if flag:
# 最高位向下一位進製
l2.next
= listnode(1)
return l3
2.2 我的改良
# definition for singly-linked list.
# class listnode:
# def __init__(self, val=0, next=none):
# self.val = val
# self.next = next
defgetlength
(l):
# 計算單鏈表長度
length =0if
not l:
return
0else
:while l:
length +=
1 l = l.
next
return length
class
solution
:def
addtwonumbers
(self, l1: listnode, l2: listnode)
-> listnode:
length1 = getlength(l1)
length2 = getlength(l2)
flag =
false
if length1 > length2:
# 保持l2為長鍊錶
l3 = l1
l1 = l2
l2 = l3
l3 = l2 # 直接在l2上相加,l3指向l2
while l1:
# 公共部分相加
if flag:
l2.val +=
1 flag =
false
l2.val += l1.val
if l2.val >9:
l2.val -=
10 flag =
true
l1 = l1.
next
p = l2
l2 = l2.
next
while l2:
# 當l2有剩餘時
if flag:
l2.val +=
1 flag =
false
if l2.val >9:
l2.val -=
10 flag =
true
p = l2
l2 = l2.
next
if flag:
# 當最高位向後一位進製時(需要新增節點時)
p.next
= listnode(1)
return l3
# 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: listnode, l2: listnode)
-> listnode:
head = listnode(l1.val+l2.val)
# 建立結果列表
cur = head # 滾動指標
while l1.
next
or l2.
next
:# 當加法沒有結束時
l1 = l1.
next
if l1.
next
else listnode(
)# 遍歷結束新增結點(根據結點定義預設為0)
l2 = l2.
next
if l2.
next
else listnode(
) cur.
next
= listnode(l1.val + l2.val + cur.val //10)
# 建立新結點,本位值相加+前一位的進製
cur.val = cur.val %
10# 原結點取餘
cur = cur.
next
# 指標滾動
if cur.val >=10:
# 當最高位產生進製時
cur.
next
= listnode(cur.val //10)
# 新增新結點
cur.val = cur.val %
10# 本位取餘
return head
LeetCode002 兩數相加
給出兩個非空的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照逆序的方式儲存的,並且它們的每個節點只能儲存一位數字。如果,我們將這兩個數相加起來,則會返回乙個新的鍊錶來表示它們的和。您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。示例 輸入 2 4 3 5 6 4 輸出 7 0 8原...
LeetCode 002 兩數相加
給你兩個非空的鍊錶,表示兩個非負的整數。它們每位數字都是按照 逆序 的方式儲存的,並且每個節點只能儲存 一位數字。請你將兩個數相加,並以相同形式返回乙個表示和的鍊錶。你可以假設除了數字0之外,這兩個數都不會以0開頭。輸入 l1 2,4,3 l2 5,6,4 輸出 7,0,8 解釋 342 465 8...
Leetcode 002 兩數相加
給出兩個非空的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照逆序的方式儲存的,並且它們的每個節點只能儲存一位數字。如果,我們將這兩個數相加起來,則會返回乙個新的鍊錶來表示它們的和。您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。示例 輸入 2 4 3 5 6 4 輸出 7 0 8 ...