Java【手撕链表】LeetCode 2. “两数相加“, 图文详解思路分析 + 代码

news2024/11/17 3:44:53

文章目录

  • 前言
  • 一、两数相加
    • 1, 题目
    • 2, 思路分析
    • 3, 代码


前言

各位读者好, 我是小陈, 这是我的个人主页, 希望我的专栏能够帮助到你:
📕 JavaSE基础: 基础语法, 类和对象, 封装继承多态, 接口, 综合小练习图书管理系统等
📗 Java数据结构: 顺序表, 链表, 堆, 二叉树, 二叉搜索树, 哈希表等
📘 JavaEE初阶: 多线程, 网络编程, TCP/IP协议, HTTP协议, Tomcat, Servlet, Linux, JVM等(正在持续更新)


对于链表题, 常用的技巧和操作是: 头插, 尾插, 快慢双指针, 傀儡节点

一、两数相加

1, 题目

OJ链接

题目给定的链表是倒序排列的, 这一点方便了我们进行遍历两个链表


2, 思路分析

本题的基本思路就是: 模拟两数加法的过程 + 构建新链表

  • 模拟两数相加: 需要考虑 “进位”, 因为题目规定每个结点只能存储一个数字, 所以形如 4 + 6 = 10, 7 + 7 = 14, 两数之和 > 9 的情况, 新结点中只能存储个位数, 那么十位上的 “1”, 就要加到后面的结点上
  • 构建新链表: 可以使用傀儡头结点的技巧, 每 new 出一个新结点就尾插到新的链表后面

准备工作如下:

  • 定义一个傀儡头结点 phead
  • 定义一个指针 cur, 指向 phead
  • 定义两个指针 cur1, cur2, 分别指向两个链表的头节点 l1, l2
  • 定义一个变量 carry, 表示进位

具体流程如下:

  • 1, carry = 2 + 5 = 7, carry / 10 = 0, 无需进位, 新结点的值就是 7

在这里插入图片描述

  • 2, carry = 4 + 6 = 10, carry / 10 = 1, 需要进位 “1”, 新结点的值为 0 , 进位 1 留给下一个结点
    在这里插入图片描述

  • 3, carry = 3 + 4 + 1 = 8 注意这里的 “1” 表示上一步的 “进位1” , carry / 10 = 0, 不需要进位, 新结点的值为 8在这里插入图片描述

此时 cur1 和 cur 2 再往后走就是链表的末尾了, 但是还没完 ! ! ! 还有一个细节 ! ! !
假设: 两个链表末尾还有进位的情况, 如下图
在这里插入图片描述
此时 cur1 和 cur2 也即将遍历到链表末尾, 但是有进位1, 所以还需要再给新链表 再尾插一个值为 1 的结点
在这里插入图片描述
此时 cur1 和 cur2 都指向了 null, carry 也为 0, 这才算真正的结束

上述当 cur1 和 cur2 都遍历到 null 时, carry 是否为 1 的判断可以放到 while 循环中, 也可以最后单独做一个 if 判断

最终返回新链表的头结点, 返回 phead.next 即可


3, 代码

	public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        if(l1 == null || l2 == null) {
            return null;
        }
        ListNode phead = new ListNode(0); // 傀儡头结点
        ListNode cur1 = l1;
        ListNode cur2 = l2;
        ListNode cur = phead;
        int carry = 0; // 表示进位
        while(cur1 != null || cur2 != null || carry != 0) {
            if(cur1 != null) {
                carry += cur1.val;
                cur1 = cur1.next;
            }
            if(cur2 != null) {
                carry += cur2.val;
                cur2 = cur2.next;
            }
            cur.next = new ListNode(carry % 10);
            carry /= 10; // 表示进位
            cur = cur.next;
        }
        return phead.next;
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1047519.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

五、过拟合问题与正则化

一、过拟合问题 (一)问题的提出 过拟合问题的定义,以线性回归为例,在房价预测的数据集中,假设函数产生的曲线有三种情况,如下图: (1)欠拟合(2)…

保姆级 -- Zookeeper超详解

1. Zookeeper 是什么(了解) Zookeeper 是一个 分布式协调服务 的开源框架, 主要用来解决分布式集群中应用系统的一致性问题, 例如怎样避免同时操作同一数据造成脏读的问题. ZooKeeper 本质上是 一个分布式的小文件存储系统 . 提供基于类似于文件系统的目录树方式的数据存储, …

【Linux】线程同步和互斥

目录 一、线程互斥1.相关概念2.互斥锁(mutex)3.互斥锁的原理4.自定义封装一个锁 二、可重入和线程安全三、死锁死锁概念死锁四个必要条件如何避免死锁 四、线程同步1.条件变量概念条件变量接口基于阻塞队列实现生产者消费者模型 2.信号量概念信号量操作接…

Databend 源码阅读:配置管理

作者:尚卓燃(PsiACE)澳门科技大学在读硕士,Databend 研发工程师实习生 Apache OpenDAL(Incubating) Committer https://github.com/PsiACE 对于 Databend 这样复杂的数据库服务端程序,往往需要支持大量的可配置选项&am…

探索Lighthouse性能分数计算背后的奥秘

本文作者为 360 奇舞团前端开发工程师 作为开发我们都知道,页面性能很重要,一个性能良好的页面可以给用户带来非常好的用户体验。那么,怎么能知道自己写的页面性能是好是坏呢? Lighthouse 是Chrome提供给开发者用来测量页面性能的…

原生js之变量、作用域与内存

原生js之变量、作用域与内存 变量变量类型原始值引用值 复制值传递参数判断类型typeofinstanceof不常用的判断方法constructor构造方法判断Object.getPrototypeOf() 最好用的判断数据类型的方法!toString.call小总结 作用域链垃圾回收标记清理引用计数v8回收v8对GC的优化新生代…

对标8155体验,降本20%以上!这家企业用“量产”证明

智能座舱逐渐成为智能汽车标配。 根据高工智能汽车研究院监测的数据显示,2022年中国市场(不含进出口)乘用车搭载智能数字座舱(大屏语音车联网OTA)前装标配交付795.05万辆,同比增长40.59%,前装搭…

卫星通信链路预算(附程序)

文章目录 简介链路基本概念信息速率与传输速率载波占用带宽载波与噪声功率比 天线参数天线增益波束宽度极化损耗 有效全向辐射功率接收系统品质因数自由空间的传播损耗链路计算程序 简介 卫星通信链路是指从信源开始,通过编码调制及微波上变频、发射机和天线&#…

流量卡不带通话功能,这样的流量卡用着真的安全?

哈喽大家好,很多朋友私信小编,咨询关于纯流量卡的一些问题,可能大家都知道,现在正规的号卡也推出了“纯流量版”,也就是不带通话功能,那么,网上的带手机号的纯流量卡真的用着安全吗?…

企业数字化转型要怎么做?在线报修系统是如何解决维修难题的?

随着科技互联网等新技术的不断发展,企业服务已从信息化迈向数字化阶段。大型企业正迫切地向数字化转型,并需要技术革新和与云的融合,以应对当今市场的挑战。为满足这一需求,广东工程宝科技有限公司推出了一款新一代故障报修产品—…

如何快速搭建一个react项目?如何使用react脚手架快速搭建项目?

如何使用react脚手架快速搭建项目? 一、前提 电脑已经安装了node和npm环境。 react文档中要求Node > 8.10 和 npm > 5.6,查看版本:node -v;npm -v; 二、步骤 1、在合适的文件夹中打开命令行窗口cmd 2、全局安…

前端项目配置 prettier、eslint、lint-stages、husky、commitlint 、style-lint设置代码书写和提交规范

prettier中文网:Options Prettier 中文网 eslint中文网 :ESLint 中文网 github husky : https://github.com/typicode/husky commitlint.js 官网:commitlint - Lint commit messages 、github:GitHub - conventiona…

为什么大力推行国密算法SSL证书

国密算法SSL证书是一种采用我国自主研发的SM2公钥算法体系,支持SM2、SM3、SM4等国产密码算法及国密SSL安全协议的数字证书。相比于普通SSL证书,国密SSL证书具有以下特点: 自主可控:国密SSL证书采用我国自主研发的SM2公钥算法体系&…

十一,从摄像机打印HDR环境贴图

越来越接近真相了。我们很自然地想到,如果把漫游器放在中心打印,是不是就可以打印整个等距柱状投影图了呢?是的,但是,只是要注意的是,立方体贴图的内部和外部尽管一样,但是还是稍微有点模糊&…

Git 学习(2)

Git 学习(2) 版本号 Git 中文件的版本号是 40 位十六进制的数字字符串,采用 SHA-1 加密算法计算获得 这样一方面可避免在合并时的冲突问题 另一方面可以用于文件定位,其中前两位表示文件夹,后 38 位表示文件 指令介…

DDS信号发生器Verilog波形发生器FPGA

名称:DDS信号发生器Verilog波形发生器 软件:Quartus 语言:Verilog 要求: 1.可产生正弦波,锯齿波,三角波,方波4种波形,频率可调 2.具有波形选择、起动、停止功能。 代码下载&…

Flink on yarn 实战和源码分析

版本:1.13.6 目录 Flink on yarn 的3种模式的使用 yarn session 模式源码分析 yarn per-job模式源码分析 application模式源码分析 Flink on yarn 的3种模式的使用 Application Mode # ./bin/flink run-application -t yarn-application ./examples/streaming…

Apollo简易地图制作

在Apollo中模拟障碍物 一、准备工作 在模拟障碍物之前,需要下载并编译Apollo源码,过程可以依据Apollo开放平台文档,其中可能遇到的问题在这里或许可以寻找到答案 二、运行Dreamview 进入容器 cd ~/apollobash docker/scripts/dev_start.s…

515万新作者投身电商事业,抖音电商将投入更多资源扶持作者长期发展

9月27日,2023抖音电商作者峰会在上海举办。上千位抖音电商作者、MCN机构、精选联盟服务商、商家等重要生态伙伴参会,围绕大会主题“向新成长”进行了深入探讨。会上,抖音电商总裁魏雯雯提到,电商作者的事业有更多发展方向。为助力…

输送机使用的常见误区

输送机也称流水线,是指在自动化生产过程中起到运输货物,联通各个生产设备的主要机械设备。但在使用的过程中,很多用户对于输送机的使用存在一定的误区,导致设备故障频出,下面就针对用户已在使用输送机过程中的常见误区…