1. 程式人生 > >LeetCode 2 兩數相加

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