LeetCode 2 Add Two Numbers——用链表模拟加法

Paraview:Python Calculator Filter python calculator过滤器 from paraview.simple import * connection = servermanager.Connect('localhost',11111) er = servermanager.sources.EnSightreader(CaseFileName='/.../data.case') er.PointArrays = ['x_velocity','1','y_velocity','1','z_velocity','1','cp','1'] 阅读详情

今天要讲的是一道经典的算法题,虽然不难,但是很有意思,我们一起来看下题目:

You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.

You may assume the two numbers do not contain any leading zero, except the number 0 itself.

翻译

给定两个非空的链表,代表两个非负整数。这两个整数都是倒叙存储,要求返回一个链表,表示这两个整数的和。

样例

Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8
Explanation: 342 + 465 = 807.

解答

题目不难理解,思路也很容易想明白,其实就是模拟小学生打竖式计算加减的方法,来计算两个整数的加和。但是既然是加法,就可能涉及进位,比如两个两位数的和可能是一个三位数。还有一个难点是需要使用链表来实现,涉及链表,编码的复杂度会更大一些。

在开始编码之前,我们先仔细观察样例:

如果你熟悉C++ STL或者其他语言工具库的用法,想必应该很容易想到可以使用map。map是一个非常常用的容器,用来存储key-value格式的数据对。

我们发现,由于链表存储数字的顺序和常规的顺序相反,所以如果存在进位的情况,我们只需要在链表的结尾加上一个节点即可。通常的计算是从右往左,而在链表当中可以理解成从左往右,其实也就是按照链表遍历的顺序计算。这点想明白,并没有什么问题。

我们做一个总结,难点大概有三个:

  1. 因为不是数组,所以我们无法拿到链表的长度。会出现两个链表长度不一致的情况
  2. 返回结果也是一个链表,需要我们自己手动创建
  3. 计算产生的进位处理

我们一个一个来分析,链表的长度未知很好处理,我们只需要判断当前节点的next节点是否为空,就可以知道链表后面是否还有后继。如果没有,那么就说明链表已经遍历到头了。

由于本题当中存在两个链表,我们需要同时判断它们是否结束:

while (l1 || l2) {
    if (l1) l1 = l1->next;
    if (l2) l2 = l2->next;
}

手动创建链表也并不复杂,我们首先创建一个链表的节点,然后依次往节点后方插入节点即可。链表插入的方式也很简单,假设当前的节点是cur,待插入的节点是node,那么我们只需要用cur.next指向node,然后将cur赋值成node即可,如图:


cur->next = node;
cur = node;

计算产生的进位问题就更简单了,由于我们是按位来计算加法,所以我们可以用一个变量标记之前位是否发生进位。如果发生,那么当前的计算结果加一。因为加法计算,最多的结果只能达到19(两位9再加上之前进位),所以进位最多只会增加1。最后,再判断一下当前位计算的结果是否产生进位即可。

int ret = l1->val + l2->val;
if (exceed) ret++;
if (ret > 9) {
    ret -= 10;
    exceed = true;
}else exceed = false;

最后,我们只需要把上述说到的三点结合起来,就可以写出代码了。如果coding还是有困难,可以在公众号TechFlow回复LeetCode2,获取代码。

还没有结束,在大多数语言当中,int都是有范围的。一般是32个二进制位,如果是int64则是64个二进制位。这是和计算机CPU的带宽是有关的,那有没有想过,超过64位二进制能表示的整数应该怎么办呢?

其实就是用类似本题当中的方法,通过链表将每一位串联起来,在计算加减乘除的时候,则是像人工打竖式那样去计算。这种算法称为高精度。感兴趣的同学,可以自行搜索,以后有机会,会在之后的文章里更新。

如果喜欢本文,请顺手扫码给个关注吧:

【牛股启动线】副图指标使用技术说明,图文案例分享,通达信炒股指标 如上图,在紫色线在黑色虚线上时,在出现紫色柱线时,通常会出现强势拉升的行情​。柱线加长加上紫色线上扬,进场跟随做多抓强势行情,紫色柱线和紫色线同时做多持续则可以继续持股。如上图,副图指标【牛股启动线】,指标信号包括紫色线走势信号和紫色柱线信号,以及底部的四条虚线技术信号​,还有一条绿色的参考线,一条黑色的虚线两天分档线。如上图,参考买点,紫色柱线开始出现时进场买点,在上图标记的位置对应的就是进场买点​。紫色柱线加长+紫色线上扬,多头共振持股,行情继续拉升阶段,持股待涨或顺势​进场做多。 阅读详情

相关推荐

金蝶云星空-协同开发云-安装开发环境

金蝶协同开发云就是不需要每一个开发都在自己的本机安装开发环境,自己安装可容易出错,包括源代码管理也一并解决了,大大减少了开发人员的工作量和降低了上手的难度。

qq_33881408的博客 5594

leetCode刷题(使用链表做加法)

Input: (2 -> 4 -> 3) + (5 -> 6 -> 4) Output: 7 -> 0 -> 8 Explanation: 342 + 465 = 807.关键是获取最后一个node节点 /** * Definition for singly-linked list. * function ListNode(val) { *...

weixin_33830216的博客 278

Ta-Lib源码解析(三):蜡烛图指标 (Candlestick Indicator) #(附Python重构代码和示意图)(补充中)

蜡烛图指标为识别K线形态的指标,笔者认为重点在于定义方式所提供的思路,背后的投资逻辑可以借鉴但不建议直接参考文档的翻译内容和源码逻辑存在不一致的现象,笔者分别列出中文百科中的定义和源码实际逻辑,供大家参考技术分析理论中的一些模糊词,ta-lib中给出了精确的定义源码

量化就是探索生活 3253

LeetCode2. Add Two Numbers (链表操作)

题目大意:给定两个列表,将它们逆序求和,输出和。题目中规定中列表中的每个数都是非负,并且都是个位数。题目分析:本题题目要求要用链表来操作,值得注意的是两个列表非等长的情况。由于我是刚开始刷LeetCode的题,所以对于编程环境还不太熟悉,在LeetCode中一些数据结构会实现给定好,不需要我们自己创建,例如本题中的结构体ListNode,这里要对指针、链表的基本操作有一个了解。首先,声明一个hea...

Jaster_wisdom的专栏 480

Ubuntu桌面消失?可能是lightdm配置在捣鬼:详细解析/etc/lightdm.conf的优先级机制与实战修复

本文详细解析了Ubuntu系统因lightdm显示管理器配置错误导致桌面消失的问题。通过分析/etc/lightdm.conf的优先级加载机制,提供了从systemctl诊断、调试模式运行到实战修复配置语法错误(如缺失[Seat:*]组)的完整方案。文章还探讨了在系统无法启动时使用chroot或恢复模式进行高级救援,并对比了lightdm与gdm3在NVIDIA驱动环境下的不同表现,帮助用户高效恢复图形界面。

weixin_29313547的博客 420

445. Add Two Numbers II 链表中的数字求和

[抄题]: You are given twonon-emptylinked lists representing two non-negative integers. The most significant digit comes first and each of their nodes contain a single digit. Add the two numbers and r...

weixin_30367873的博客 139

LiblibAI新手教程:从零开始训练你的第一个LoRA模型(保姆级指南)

本文提供LiblibAI平台上从零开始训练LoRA模型的保姆级教程,涵盖数据准备、参数优化到效果调优全流程。详细解析LoRA技术优势,包括云端计算资源、自动化预处理工具等,帮助新手快速掌握自定义模型训练技巧,实现高效AI绘画创作。

dell8的博客 617

leetcode2 Add Two Numbers【链表模拟大数加法】

给定的链表是倒序的 MDZZ………………我还自己写了半天反转链表,才发现不对…………然后后来又是各种报错,发现自己写麻烦了,总共先定义两个指针,一个作为头,一个往后走就可以了…………AC1.0/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; *...

MissZhou要努力 311

【乐鑫】唤醒词修改方法

乐鑫科技的语音识别模块(如ESP-SR)支持自定义唤醒词,但需通过官方工具链完成。

以实战经验介绍行业知识 823

自定义载板RK3588HDMI输入配置完整解决方案

✅ HDMI输入信号检测✅ 自动时序识别(支持1080p@60Hz等标准格式)✅ V4L2视频设备接口✅ 实时视频流捕获✅ H.264编码录制✅ HDCP内容保护支持问题根因识别:发现了hdmim1模块资源冲突的本质问题硬件设计理解:明确了Orange Pi 5 Plus的真实硬件设计意图功能实现:成功启用HDMI输入功能,替代了无法使用的HDMI1输出完整验证:建立了从硬件检测到视频录制的完整测试流程。

梁俊星的博客 1271

LeetCode 445. Add Two Numbers II

问题描述 You are given two non-empty linked lists representing two non-negative integers. The most significant digit comes first and each of their nodes contain a single digit. Add the two numbers and r...

Keep Learning 211

【图像超分】论文精读:Residual Dense Network for Image Super-Resolution(RDN)

一个非常深的卷积神经网络 (CNN) 最近在图像分类 (SR) 方面取得了巨大成功,并提供了分层特征。然而,大多数基于深度 CNN 的 SR 模型没有充分利用原始低分辨率 (LR) 图像中的层次特征,从而实现相对较低的性能。在本文中,我们提出了一种新的残差密集网络(RDN)来解决图像SR中的这个问题。我们充分利用所有卷积层的分层特征。具体来说,我们提出了残差密集块(RDB)通过密集连接的卷积层提取丰富的局部特征。RDB 进一步允许将前一个 RDB 的状态与当前 RDB 的所有层直接连接,从而产生连续的内存

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 7256

LeetCode //C - 445. Add Two Numbers II

【代码】LeetCode //C - 445. Add Two Numbers II。

Made in Code 1897

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

LeetCode 2. Add Two Numbers(C++)

使用了O(1)的额外空间,思路是将两个链表遍历并合并,合并过程中不断计算进位,如果计算到最后一次加法仍有进位(可能是两个链表对应位置值相加产生进位或者上一次的进位加本次值又产生进位),那么需要加一个值为1的新结点。 这种思路的优点是空间复杂度小,缺点是实现比较复杂(跟借助一个额外的数组和链表相比)。 /** * Definition for singly-linked list. * st

赞美月亮的专栏 1435

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Leetcode[2] Add Two Numbers and Leetcode[445] Add Two Numbers II

Leetcode[2] Add Two Numbers class Solution(object): def addTwoNumbers(self, l1, l2): """ :type l1: ListNode :type l2: ListNode :rtype: ListNode """ ...

只为分享 252

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

LeetCode 2.Add Two Numbers 两数相加 Python3 三种解法

LeetCode 2.Add Two Numbers 两数相加 Python3 由于做提前连链表是怎么实现的都不知道所以补了点课。 Single Linked List 代码来自这位兄台 pasilo https://blog.51cto.com/13047263/2070815 内容理解我看的知乎 如何更好的理解链表 以下代码和LeetCode上面的链表稍微有些许不同,那个里面链表和链表上面的节...

Aixoum is Me 1290

LeetCode解题笔记 - 2. Add Two Numbers

2. Add Two Numbers You are given twonon-emptylinked lists representing two non-negative integers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the...

a541967687的博客 209

JS斩杀LeetCode(2):Add Two Numbers

题目: You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers a

清风的博客 2225

[LeetCode - 模拟加法] 2. Add Two Numbers

1 问题 You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and re

TecLand 361

Leetcode 2 Add Two Numbers

Leetcode 2 Add Two Numbers You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order and each of their nodes contain a single digit. Add t...

博学 笃志 切问 近思 197

【LeetCode】两个单链表模拟加法:Add Two Numbers and Add Two Numbers II

1.Add Two Numbers You are given twonon-emptylinked lists representing two non-negative integers. The digits are stored inreverse orderand each of their nodes contain a single digit. Add the two numbers and return it as a linked list. You may assume ...

Arlingtonroad的博客 243

2. Add Two Numbers

2. Add Two Numbers Medium 59971568Share You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order and each of their nodes contain a single...

Joy 650

【LeetCode】2. Add Two Numbers 解题报告(Python)

【LeetCode】2. Add Two Numbers 解题报告(Python)题目描述解法一:先求和,再构建链表解法二:采用一个进位carry方便的完成一次遍历得出结果解法三:递归 题目地址:https://leetcode.com/problems/add-two-numbers/ 题目描述 You are given two non-empty linked lists represent...

ttinch的博客 261

Leetcode Add Two Numbers Python 用链表的方式做加法,如何构造链表

Leetcode 第2题 Add Two Numbers You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list. You may

润泽的博客 217

LeetCode 开刷2 ADD Two Numbers

趁着还有热情,接着刷。 题目: You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers

大三狗现在才努力还不算晚吧?! 3373
上一篇: LeetCode 1 Two Sum——在数组上遍历出花样
下一篇: 线性代数精华2——逆矩阵的推导过程
TechFlow
博客等级 码龄7年 347粉丝 276原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值