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

结果:

本地编辑情况:

力扣结果:

原文地址:https://www.cnblogs.com/ZFJ1094038955/p/13340063.html