zoukankan      html  css  js  c++  java
  • 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

    结果:

    本地编辑情况:

    力扣结果:

  • 相关阅读:
    一些专有名词词汇
    UE、UI、 IA和IxD傻傻分不清
    关于SNMP4J取值乱码解决方法
    个人推荐
    软件系统分类
    Ext 4.2树节点搜索功能
    android picke ui
    android 滚轮
    一、dialog.show()引起的android.view.WindowManager$BadTokenException错误
    fragment getactivity 为null解决
  • 原文地址:https://www.cnblogs.com/ZFJ1094038955/p/13340063.html
Copyright © 2011-2022 走看看