題目:
思路分析:
讓求兩個數相加是個經典的問題。
讓我們複習一下小學的求加法:
- 把兩個加數的個位數字對齊;
- 從兩個加數的個位開始相加,如果相加結果大於10則只保留減去10的數字,並記錄是否爲進位。
- 兩個加數的前面一位數字相加,加上進位,重複步驟2.
所以,我們需要三個變量:加數a當前的數字s1,加數b當前的數字s2,進位carry.
計算過程是:從兩個數字的末尾數字開始,依次向前遍歷執行s1, s2, carry相加,一直持續到加數a的所有數字用完 並且 加數b的所有數字用完 並且 進位carry用完。
至於這個題目,讓我們求兩個鏈表相加的結果,按照我們上面的分析,我們需要從末尾數字開始算起。那麼我們可以1. 翻轉鏈表,2. 使用輔助棧。題目說了最好不要翻轉鏈表,那麼我們用輔助棧。
具體操作:
- 先遍歷兩個鏈表,把所有的數字放到棧裏。
- 同時彈出兩個棧中的元素(此時已經末位對齊),執行s1 + s2 + carry。
- 加法結果只保留上述計算結果 % 10的結果,carry是進位。
- 生產一個新的鏈表節點,放在結果鏈表的開頭位置。
- 爲了找到鏈表的開頭,我用了head節點,head.next是真正的兩數相加的結果。
代碼如下:
1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 """ 4 # @Time : 2020/7/18 19:32 5 6 # @Author : ZFJ 7 8 # @File : 兩數相加II.py 9 10 # @Software: PyCharm 11 """ 12 13 14 # Definition for singly-linked list. 15 class ListNode(object): 16 def __init__(self, x): 17 self.val = x 18 self.next = None 19 20 21 class Solution(object): 22 def addTwoNumbers(self, l1, l2): 23 """ 24 針對題目設置的反向問題,我們可以使用棧來模擬,那麼就做到了先進後出的效果 25 :type l1: ListNode 26 :type l2: ListNode 27 :rtype: ListNode 28 """ 29 # 用兩個列表來模擬棧 30 stack1 = [] 31 stack2 = [] 32 # 將鏈表中元素放入到列表中 33 while l1: 34 stack1.append(l1.val) 35 l1 = l1.next 36 while l2: 37 stack2.append(l2.val) 38 l2 = l2.next 39 # 設置一個虛擬節點,鏈表技巧 40 head = ListNode(0) 41 # 進位數 42 carry = 0 43 # 棧1或者棧2或者進位數不爲空 44 while stack1 or stack2 or carry: 45 s1 = stack1.pop() if stack1 else 0 46 s2 = stack2.pop() if stack2 else 0 47 # 用來現在相加的和 48 current = s1 + s2 + carry 49 carry = 1 if current >= 10 else 0 50 # 創建新節點存儲當前位的數字,由於存在進位,所以新節點的值爲求和以後對10取餘的結果 51 current = current % 10 52 currentNode = ListNode(current) 53 # 將新節點的Next指向head這個虛擬節點的Next 54 currentNode.next = head.next 55 # 更新head虛擬節點的next讓他指向新節點 56 head.next = currentNode 57 return head.next 58 59 60 if __name__ == "__main__": 61 a1 = ListNode(7) 62 a2 = ListNode(2) 63 a1.next = a2 64 a3 = ListNode(4) 65 a2.next = a3 66 a4 = ListNode(3) 67 a3.next = a4 68 69 b1 = ListNode(5) 70 b2 = ListNode(6) 71 b1.next = b2 72 b3 = ListNode(4) 73 b2.next = b3 74 75 test = Solution().addTwoNumbers(a1, b1) 76 while test != None: 77 print(f"和是:{test.val}") 78 test = test.next
結果:
本地編輯情況:
力扣結果: