思路
- 因爲整數是按照逆序存放在鏈表中,所以直接從頭結點就可以開始相加
- 老規矩,加上輸入值判斷
- 兩個數相加有可能產生
進位
, 所以下一個結點相加時需要考慮進位的1 - 當一個數加完,另外一個還有節點, 只加這一個結點
- 當最後兩個結點都加完,但是進位還在
考慮完畢
編寫
按照上面的思路,按照正常邏輯寫出如下代碼
# 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:
# 進行輸入值判斷
if(l1 == None or l2 == None):
return None
sum = l1.val + l2.val #兩個數相加的和
resultList = ListNode(sum%10) #初始化結果鏈表
p = resultList #中間指針
while(l1.next != None and l2.next != None):
l1 = l1.next
l2 = l2.next
sum = l1.val + l2.val + sum//10
temp = ListNode(sum%10)
p.next = temp
p = p.next
# 當l1不爲空
while(l1.next != None):
l1 = l1.next
sum = l1.val + sum//10
temp = ListNode(sum%10)
p.next = temp
p = p.next
# 當l2不爲空
while(l2.next != None):
l2 = l2.next
sum = l2.val + sum//10
temp = ListNode(sum%10)
p.next = temp
p = p.next
#還有進位時
if(sum//10 == 1):
temp = ListNode(1)
p.next = temp
p = p.next
return resultList
思考與學習
- 看了大神的代碼, 發現自己的3個while循環,雖然邏輯很清楚,但是看着就很多,可以合併爲一個
- 怎麼合併呢,發現三個while的判斷都是鏈表是不是爲空,可以這裏下手
- 於是得到下面的代碼,代碼明顯減少,運行也快了一點
- 代碼帶可以繼續改進,
兩個if和兩個賦值0可以合併一下
# 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:
# 進行輸入值判斷
if(l1 == None or l2 == None):
return None
sum = l1.val + l2.val #兩個數相加的和
resultList = ListNode(sum%10) #初始化結果鏈表
p = resultList #移動指針
while(l1.next != None or l2.next != None):
l1.val = 0
l2.val = 0
l1 = l1 if(l1.next==None) else l1.next
l2 = l2 if(l2.next==None) else l2.next
sum = l1.val + l2.val + sum//10
temp = ListNode(sum%10)
p.next = temp
p = p.next
#還有進位時
if(sum//10 == 1):
temp = ListNode(1)
p.next = temp
p = p.next
return resultList