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]