LeetCode 2 兩數相加
題目位置:https://leetcode-cn.com/problems/add-two-numbers/description/
大致解題思路:
遍歷每個位置的l1和l2,逐個位置相加,相加結果node_val大於等於10的話,就保留node_val-10的部分,並且向下一位進位+1,如果p的後一個位置為None,則建立新的節點賦值為1,否則當前節點值為node_val
錯誤原因:
l2長度大於l1時,無法正確連線l2超出l1的部分
複習知識點:
1.Python 深拷貝,淺拷貝
2.Python 關於“=”號賦值,引用的關係
分析:
1.Python類似於C中的指標運算可以直接用“=”號計算,此時二者記憶體地址相等
“在 python 中賦值語句總是建立物件的引用值,而不是複製物件。因此,python 變數更像是指標,而不是資料儲存區域,”
2. (主要原因)Python 中變數賦值是在記憶體中建立新的空間儲存變數值,直接p1 = p2,會導致p1和前面的“鏈”斷掉,所以正確的做法應該是p1.next = p2來保持“鏈”在一起
執行成功的程式碼:
class ListNode: def __init__(self, x): self.val = x self.next = None def addTwoNumbers(l1, l2): """ :type l1: ListNode :type l2: ListNode :rtype: ListNode """ if l1 == None: return l2 if l2 ==None: return l1 p1 = l1 p2 = l2 ans = ListNode(0) while p1 != None: if p2 != None: node_val = p1.val + p2.val if node_val >= 10: node_val = node_val-10 if p1.next!=None: p1.next.val += 1 else: p1.next = ListNode(1) p1.val = node_val p2 = p2.next else: if p1.val >=10: p1.val = p1.val-10 if p1.next !=None: p1.next.val +=1 else: p1.next = ListNode(1) if p1.next == None: break else: p1 = p1.next if p2 != None:#(p1 == None,and p2!= none) p1.next = p2 return l1
更好的做法:
沒有想到的點:
1.while l1 or l2,這樣迴圈的話就可以不用管到底是哪個連結串列更長,,迴圈直到兩個連結串列都為None,都為None後再看看最後一次有沒有進位,如果有進位的話就+1
2. while內l1和l2兩個if分開來向後移動
l1= l1.next
l2=l2.next
3.這裡採用了頭結點tmp,賦值的時候都是統一通過res.next = ListNode(VALUE)來賦值,這樣可以避免連結串列結構“斷鏈”的情況發生,最後返回的時候res = tmp.next返回res
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def addTwoNumbers(self, l1, l2):
"""
:type l1: ListNode
:type l2: ListNode
:rtype: ListNode
"""
if l1 is None:
return l2
if l2 is None:
return l1
tmp = ListNode(0)
res = tmp
flag = 0
while l1 or l2:
tmpsum = 0
if l1:
tmpsum = l1.val
l1 = l1.next
if l2:
tmpsum += l2.val
l2 = l2.next
tmpres = ((tmpsum + flag) % 10)
flag = ((tmpsum + flag) // 10)
res.next = ListNode(tmpres)
res = res.next
if flag:
res.next = ListNode(1)
res = tmp.next
del tmp
return res