Leetcode刷題日記(2020.07.19):兩數相加II

題目:

 

 

 思路分析:

讓求兩個數相加是個經典的問題。

讓我們複習一下小學的求加法:

  1. 把兩個加數的個位數字對齊;
  2. 從兩個加數的個位開始相加,如果相加結果大於10則只保留減去10的數字,並記錄是否爲進位。
  3. 兩個加數的前面一位數字相加,加上進位,重複步驟2.

 

所以,我們需要三個變量:加數a當前的數字s1,加數b當前的數字s2,進位carry.

計算過程是:從兩個數字的末尾數字開始,依次向前遍歷執行s1, s2, carry相加,一直持續到加數a的所有數字用完 並且 加數b的所有數字用完 並且 進位carry用完。

至於這個題目,讓我們求兩個鏈表相加的結果,按照我們上面的分析,我們需要從末尾數字開始算起。那麼我們可以1. 翻轉鏈表,2. 使用輔助棧。題目說了最好不要翻轉鏈表,那麼我們用輔助棧。

 

 

具體操作:

  1. 先遍歷兩個鏈表,把所有的數字放到棧裏。
  2. 同時彈出兩個棧中的元素(此時已經末位對齊),執行s1 + s2 + carry。
  3. 加法結果只保留上述計算結果 % 10的結果,carry是進位。
  4. 生產一個新的鏈表節點,放在結果鏈表的開頭位置。
  5. 爲了找到鏈表的開頭,我用了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

結果:

本地編輯情況:

 

 

力扣結果:

 

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