zoukankan      html  css  js  c++  java
  • LeetCode | No.2 两数相加

    ​题目描述

    给出两个非空的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序的方式存储的,并且它们的每个节点只能存储一位数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

    1 示例:
    2 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
    3 输出:7 -> 0 -> 8
    4 原因:342 + 465 = 807

    来源:力扣(LeetCode)

    链接:https://leetcode-cn.com/problems/add-two-numbers

    题目解析

    本题是将两个链表形式的数字相加,计算结果也同样用链表来表示。链表在python中可以用类来描述,题中已经给出,其中包含数据域和指针域。关于链表在python中的实现我会再写一篇文章来阐述。对于本题来说数据在链表中的存储按逆序排列,也就是说链表的第一个节点就是数字的个位,依次为十位、百位等。两数相加完全可以按照小学列竖式加法来计算,也就是个位相加,向十位进位,以此类推。


    需要注意的一点是,两个数字的位数不一定相等,那么可以先将存在的对应位相加,多出来的数位直接与进位相加即为结果。看程序会更容易理解一些。

     1 # Definition for singly-linked list.
     2 class ListNode:
     3     def __init__(self, x):
     4         self.val = x
     5         self.next = None
     6  7 class Solution:
     8     def addTwoNumbers(self, l1, l2):
     9         """
    10         :type l1: ListNode
    11         :type l2: ListNode
    12         :rtype: ListNode
    13         """
    14         p = start = ListNode(-1)
    15         carry = 0
    16         while l1 and l2:
    17             p.next = ListNode(l1.val + l2.val + carry)
    18             carry = p.next.val // 10
    19             p.next.val %= 10
    20             p = p.next
    21             l1 = l1.next
    22             l2 = l2.next
    23         res = l1 or l2
    24         while res:
    25             p.next = ListNode(res.val + carry)
    26             carry = p.next.val // 10
    27             p.next.val %= 10
    28             p = p.next
    29             res = res.next
    30         if carry:
    31             p.next = ListNode(carry)
    32         return start.next

    总体来说过程中主要分两部分,第一部分是对应位相加,再加上进位值(默认为0,即计算个位时),对10取余得到对应位的数字,赋值给新链表,对10取整得到进位值,赋值给carry;第二部分是判断出其中一个数字已经遍历完,那么用剩下数字与进位相加,赋值给新链表。

    执行结果显示用时较长,内存消耗较小,有新的方法可以一起来讨论哈!

    扫描二维码

    获取更多精彩

    小田学Python

             
                       

    作者:渔单渠 微信搜索“小田学Python”
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    生成全局id的方式
    如何使得搜索的信息更准确?
    水平分区
    大表如何优化?
    MySQL_fetch_array和MySQL_fetch_object的区别是什么?
    BLOB和TEXT区别
    如何在Unix和MySQL时间戳之间进行转换?
    用ActionSupport实现验证
    服务器端验证--验证框架验证required.
    自定义类型转换器converter
  • 原文地址:https://www.cnblogs.com/yudanqu/p/12297997.html
Copyright © 2011-2022 走看看