day03 445. 兩數相加 II [中等]

1.題目描述 445. 兩數相加 II

給你兩個 非空 鏈表來代表兩個非負整數。數字最高位位於鏈表開始位置。它們的每個節點只存儲一位數字。將這兩數相加會返回一個新的鏈表。

你可以假設除了數字 0 之外,這兩個數字都不會以零開頭。

進階:

如果輸入鏈表不能修改該如何處理?換句話說,你不能對列表中的節點進行翻轉。

示例:

輸入:(7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出:7 -> 8 -> 0 -> 7

2.思路分析

2.1 整體這個問題比較簡答,實際上就是翻轉鏈表,按照算數邏輯進位即可,翻轉鏈表用遞歸做思路簡單直接,不容易出錯

2.2 進階要求不能修改輸入鏈表,兩個思路吧,一個是我直接拷貝唄,然後執行上述邏輯;另一個是我讀取構成字符串,轉爲int,然後加起來之後根據結果構造成鏈表返回即可。

3.debug記錄

3.1 本來定義的翻轉鏈表同時返回鏈表長度的,結果後來編碼過程中又給忘記了

3.2 本來對於最後進位的情況構造了節點,但是忘了加到原有的節點上去了

 

如何避免來儘可能達到bugfree呢?

1)如果有任何思路和操作有點特殊,不是非常簡單,都要備註記下來,以防忘記

2)最後寫完之後進行細緻的代碼review,把一些明顯的錯誤點避免掉,而且可以查缺補漏,將特殊注意的地方都縷一遍

3)樹立前條件,中間不變量,後條件的邊界校驗和斷言編程習慣

 

4.提交成績

執行用時 :76 ms, 在所有 Python 提交中擊敗了30.53%的用戶

內存消耗 :12.9 MB, 在所有 Python 提交中擊敗了33.33%的用戶

 

5.ac代碼(python):

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution(object):
    def reverseList(self, l1):
        fist_node = l1
        mlen = 0
        if l1.next:
            fist_node, mlen = self.reverseList(l1.next)
            l1.next.next = l1
        l1.next = None
        return fist_node, mlen + 1

    def addTwoNumbers(self, l1, l2):
        """
        :type l1: ListNode
        :type l2: ListNode
        :rtype: ListNode
        不考慮進階情況,思路比較簡單直接,就是先翻轉鏈表,這樣就可以從個位開始
        將較長的可以作爲累加和一方,最後將該鏈表翻轉返回根節點即可
        """
        l1, l1_len = self.reverseList(l1)
        l2, l2_len = self.reverseList(l2)
        result_list = l1
        other = l2
        if l1_len < l2_len:
            result_list = l2
            other = l1
        result_cur_node = result_list
        other_cur_node = other
        jinwei = 0
        last_node = None
        while result_cur_node or jinwei > 0:
            new_value = jinwei
            if not result_cur_node:
                result_cur_node = ListNode(jinwei)
                last_node.next = result_cur_node
            else:
                new_value += result_cur_node.val
            if other_cur_node:
                new_value += other_cur_node.val
                other_cur_node = other_cur_node.next
            result_cur_node.val = new_value % 10
            jinwei = new_value // 10
            if not result_cur_node.next:
                last_node = result_cur_node
            result_cur_node = result_cur_node.next
        return self.reverseList(result_list)[0]

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章