LeetCode刷题:链表两数相加

LeetCode刷题:链表两数相加

  链表:

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

解题分析:

通俗的讲就是从两个非空的链表获取节点值做一个加法,生成新的一个链表。根据事例提出几个问题:

①怎么确定第一个节点?

②假如我们确定了头节点是7,当我们移向下一个节点的时候,怎么留住之前的节点7呢?

dummyHead虚拟头节点:

对于单链表来说,唯一能让它保持联系就是它的头节点,对于事例来说7就是我们的头节点,但是在计算出头节点7之前,我们不知道头节点是什么。这里我们有一个通用的做法:建立一个dummyHead,我们初始一个头节点是0,在计算完链表之后,我们只需要获取dummyHead.next,就是我们想要的链表。

ListNode dummyHead = new ListNode(0); 指针节点:

为了解决第二个问题,当获取到两个链表的头节点2和5计算得到dummyHead的 头节点指向了7,但是我们需要移动dummyHead = dummyHead .next 到下一个节 点,才能对两个链表的4和6计算赋值给dummyHead,这样的话dummyHead的头节点 7相当于就被移除了,所以我们需要一个指针节点curr来指向dummyHead,当curr 移动的时候,dummyhead始终保持节点。

作者:ran-10 链接:https://leetcode-cn.com/problems/add-two-numbers/solution/liang-shu-xiang-jia-xiao-ji-qiao-zhi-dummyheadhe-z/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 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: ListNode, l2: ListNode) -> ListNode:
 9         dummy = p = ListNode(None) #保存头结点,返回结果
10         s = 0 #每一步的求和暂存变量
11         while l1 or l2 or s:           #循环条件:l1 或者l2(没有遍历完成),s(进位)不为0
12             s += (l1.val if l1 else 0) + (l2.val if l2 else 0)           #这其实是好多代码,我自己写了好多行,但是作者这样写非常简洁,赞
13             p.next = ListNode(s % 10)             #构建新的list存储结果,其实用较长的加数链表存也可以,%10:求个位
14             p = p.next                        
15             s //= 10                                         #求进位
16             l1 = l1.next if l1 else None           
17             l2 = l2.next if l2 else None
18         return dummy.next

怎么说呢,还是不太理解,python里面运行链表不熟悉,直接说就是对链表这个东西不熟悉,明天再写一篇自己的解法

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/2769.html原文链接:https://javaforall.net

(0)
上一篇 2021年2月26日 下午6:37
下一篇 2021年2月26日 下午6:37


相关推荐

  • OpenCV copyTo、clone、“=”与拷贝构造函数的区别

    OpenCV copyTo、clone、“=”与拷贝构造函数的区别opencv 中为矩阵复制提供了 copyTo 函数 clone 函数 重载运算符和拷贝构造函数 用法非常简单 Matsrcimage imread 1 jpg Matfirstimag secondimage thirdimage srcimage copyTo firstimage secondimage srcimage clon

    2026年3月16日
    2
  • mysql文件导入sqlserver_mysql导入sql文件命令

    mysql文件导入sqlserver_mysql导入sql文件命令问题来源有的时候,在使用MySQL数据库建表时,可能不需要直接在mysql数据库中建表,而需要导入外部已有的数据库表文件,方便我们使用。那么导入的方法呢?这里介绍一个很普遍也很简单的方法,步骤如下:导入步骤打开MySQL数据库,黑窗界面,如图:这里输入密码‘root’,回车。。。先确定你要建立的数据库名字,比如这里我新建数据库名字叫“house-01”,如下图。(说明:如果sql文件的内容中有创建数据库的语句,或者想将表存放在已有的数据库,在这里就不需要再创建数据库。即直接使用已经

    2022年10月2日
    4
  • JVM 关于静态变量存储位置的问题[通俗易懂]

    JVM 关于静态变量存储位置的问题[通俗易懂]形如staticList<>a=newList<>();我知道a指向的List的对象肯定是在堆内存中,但a本身它存放在哪儿?java8后,永久代已经被移除,被称为“元数据区”的区域所取代。类的元数据放入nativememory,字符串池和类的静态变量放入java堆中,静态变量初始化就在堆,a就在堆中。…

    2022年6月6日
    42
  • Unity+OpenCV 人脸识别追踪

    Unity+OpenCV 人脸识别追踪项目需要一个人脸识别追踪的效果,所以查找了一些资料,自己做了一个功能,基本效果已经实现了。首先项目需要OpenCV的开发环境,所以首先一定要在开发电脑上装上OpenCV的开发环境,流程很简单,直接去http://opencv.org/downloads.html官网下载OpenCV的安装文件就可以了,然后配置电脑的环境变量。我的电脑是windows操作系统配置好就是这个样子,然后要把用到的

    2022年5月29日
    133
  • webstorm好用的插件_chrome实用的插件

    webstorm好用的插件_chrome实用的插件CodeGlance代码的缩略图,VScode,sublime编辑器都有这个功能{:height=“200”width=“400”}MaterialThemeUI修改主题颜色,图标那些等等AngularJS支持angularjs的语法提示ideaVim可以让webstorm编辑器支持vimAceJump快速定位光标位置,有了它你可以丢弃鼠标了。eslint语…

    2025年10月14日
    8
  • windows 7 boot loader

    windows 7 boot loaderFrom:http://blog.csdn.net/richion/archive/2009/08/05/4414189.aspxWindow7的核心版本号是NT6.1,和vistaNT6.0还是属于一个系列的,因此采用了一样的启动管理机制。对于双系统来说,正如98和xp共存的双系统一样,xp和7共存的算系统安装也是要有先后顺序的。因为windows的启动管

    2022年10月12日
    9

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号