Leetcode刷题日记(2020.07.19):两数相加II
题目:
思路分析:
让求两个数相加是个经典的问题。
让我们复习一下小学的求加法:
- 把两个加数的个位数字对齐;
- 从两个加数的个位开始相加,如果相加结果大于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
结果:
本地编辑情况:
力扣结果: