題目:兩數相加 (難度:中等) 給定兩個非空鏈表來表示兩個非負整數。位數按照逆序方式存儲,它們的每一個節點只存儲單個數字。 將兩數相加返回一個新的鏈表。數據結構
你能夠假設除了數字 0 以外,這兩個數字都不會以零開頭。app
示例: 輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 輸出:7 -> 0 -> 8 緣由:342 + 465 = 807學習
思路: 本題的思路很簡單,按照小學數學中學習的加法原理從末尾到首位,對每一位對齊相加便可。 技巧在於如何處理不一樣長度的數字,以及進位和最高位的判斷。將兩個單鏈表表示的數字相加,再將結果用單鏈表表示出來。 主要考察對鏈表的操做,對鏈表這種數據結構的遍歷、增、刪等操做應該熟練。測試
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 not l1: return l2 if not l2: return l1 val1, val2 = [l1.val], [l2.val] while l1.next: val1.append(l1.next.val) l1 = l1.next while l2.next: val2.append(l2.next.val) l2 = l2.next # 如:str(0) = '2' num1 = ''.join([str(i) for i in val1[::-1]]) #列表val1的[2,4,3]反向並str格式化爲字符串形式:'342' # print(num1 == '342') num2 = ''.join([str(i) for i in val2[::-1]]) #列表val2的[5,6,4]反向並格式化爲字符串形式:'465' tmp = str(int(num1) + int(num2))[::-1] # 807格式化爲字符串並反向,獲得字符串tmp = '708' res = ListNode(int(tmp[0])) # 如:res此時包括之後都是鏈表表頭-head,指向第一個節點。res = ListNode(7) run_res = res # run_res剛開始是指向第一個節點 # run_res.val = 7 for i in range(1, len(tmp)): run_res.next = ListNode(int(tmp[i])) run_res = run_res.next # print(res.val, res.next.val, res.next.next.val) 輸出7 0 8 return res # 測試 if __name__ == '__main__': # 建立對象Solution sol = Solution() # 定義l1鏈表 l1 = ListNode('2') l1.next = ListNode(4) l1.next.next = ListNode(3) # 定義l2鏈表 l2 = ListNode(5) l2.next = ListNode(6) l2.next.next =ListNode(4) # 獲取返回值的鏈表 res = sol.addTwoNumbers(l1, l2) print(res.val, res.next.val, res.next.next.val)
輸出:spa
7 0 8 [Finished in 0.2s]