leetcode 2.两数相加

力扣(Leetcode)第2题:两数相加(C语言版本) 通常,我们从左到右书写数字,例如数字123,最左边的是最高位(百位),然后是十位,最后是个位。但是在这个特殊的表示法中,链表的第一个节点将代表个位数,第二个节点代表十位数,以此类推,最左边的节点(链表的头节点)代表最低位,而最右边的节点(链表的尾节点)代表最高位。在这种表示法中,每个节点只存储一个数字(0-9),并且每个链表的第一个节点(最近个位)实际上是整个数字的最低有效位,而最后一个节点(最远离个位)是最高位。由于每个节点只存储一位数字,相加的结果可能需要进位到下一个更高的位。它们每位数字都是按照。 阅读详情

leetcode 2.两数相加

题目描述

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

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

解题思路

该题是链表对应值相加,没有难度,但是要考虑的情况比较多
1.两个链表一样长
2.链表的长度不相等
3.进位情况
4.最后一次相加进位的情况
5.单个链表进位的情况

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode* cur = new ListNode(-1); // 定义一个链表存储结果
        ListNode* resNum = cur;  
        bool flag = false;      // 进位标志

        ListNode* cur1 = l1;
        ListNode* cur2 = l2;
        // 为了防止两个链表不是一样长,只有两个节点都不为空的时候,才进行相加操作
        while((cur1 != NULL) && (cur2 !=NULL)){
            cur->next = new ListNode(0);
            cur = cur->next;
            // 进位的情况下,需要在两数相加的结果上加1, 同时判断当前相加是否进位
            if(flag){
                if((cur1->val + cur2->val + 1)/10 == 0){
                    flag = false;
                }
                else{
                    flag = true;
                }
                cur->val = (cur1->val + cur2->val + 1)%10;
            }
            else{   // 不进位的情况下,只要判读相加是否进位。
                if((cur1->val + cur2->val)/10 == 0){
                    flag = false;
                }
                else{
                    flag = true;
                }
                cur->val = (cur1->val + cur2->val)%10;
            }
            // 移动指针位置
            cur1 = cur1->next;
            cur2 = cur2->next;
        }
        // l1比较长的情况,这里需要考虑有多个9的情况,所以需要遍历一下
        while(cur1 != NULL){
            cur->next = cur1;
            cur = cur->next;
            if(flag){
                cur->val += 1;
                if(cur->val == 10){
                    cur->val = 0;
                    flag = true;
                }
                else{
                    flag = false;
                }
            }
            else{
                break;
            }
            cur1 = cur1->next;
        }
        // l2比较长的情况,同样需要考虑多个9的情况
        while(cur2 != NULL){
            cur->next = cur2;
            cur = cur->next;
            if(flag){
                cur->val += 1;
                if(cur->val == 10){
                    cur->val = 0;
                    flag = true;
                }
                else{
                    flag = false;
                }
            }
            else{
                break;
            }
            cur2 = cur2->next;
        }
        // 最后相加进位的情况
        if(flag){
            cur->next = new ListNode(1);
        }
        return resNum->next;
    }
};

上面是直接按照思路写的,下面是精简一下代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode* head = new ListNode(-1);	 // 存储结果的链表	
        ListNode* cur = head;                // 移动节点

        bool flag = false;                  // 进位
        int sum = 0;

        while(l1 != NULL || l2 != NULL){
            sum = 0;   // sum置位
            // l1是否循环完毕,取val值
            if(l1 != NULL){
                sum += l1->val;
                l1 = l1->next;
            }
            // l2是否循环完毕,取val值
            if(l2 != NULL){
                sum += l2->val;
                l2 = l2->next;
            }
            // 进位加1
            if(flag){
                sum += 1;
            }
            
            cur->next = new ListNode(sum%10);   // 向链表中添加值
            cur = cur->next;  
            flag = (sum/10 != 0) ? true:false;  // 当前相加的结果是否进位
        }
        // 最后一位相加是否有进位情况
        if(flag){
            cur->next = new ListNode(1);
        }
        return head->next;
    }
};

欢迎大家关注我的个人公众号,同样的也是和该博客账号一样,专注分享技术问题,我们一起学习进步
在这里插入图片描述

力扣算法题2. 两数相加 2. 两数相加 第一次尝试后做不出来,看了一遍官方的解题思路后,开始修改自己的代码,最终通过,仅作学习记录,最后看了官方的代码,恍然大悟,自己写的确实不够标准和泛化,存在太多if语句,冗余严重,欢迎各位大佬指点! 下面附上自己写的代码和伪代码作为学习记录—— 解题思路 1.1 实例化两个指针l3,l4,l3:表头,l4:工作指针 1.2 初始化进位值w=0,i=0(i=1时表征第一次对l1和l2的表头元素做相加); 1.3 判断l1与l2指针的null情况 1.3.0 i++ 1.3.1 l1!=null 阅读详情

相关推荐

python【力扣LeetCode算法题库】2-两数相加

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

NJU phd 在读。 867

力扣(LeetCode):#2-两数相加

文章目录力扣(LeetCode):#2-两数相加题目描述:题解:方法:初等数学 力扣(LeetCode):#2-两数相加 题目描述: 题解: 方法:初等数学 Java /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution {

忘尘丶莫负的博客 284

LeetCode 2 - 两数相加

是一道经典链表操作问题,经常作为面试中基础题的变体被考察。掌握多种解法及其变体,并熟悉其核心思路和模板代码,可以快速备战相关链表或大数计算问题。给定两个非空链表,它们代表两个非负整数,每个节点保存一个数字,数字按(个位在链表头部),求两个数的和并返回一个新的链表,表示其逆序和。l1l2carrysum % 10carrymn如果链表存储的是整数的正常顺序(高位在前),如何求两数和?

互联网架构师笔记 1161

[Golang]力扣Leetcode - 2.两数相加

[Golang]力扣Leetcode - 2、两数相加

皮埃尔的博客 438

Transformer在CV里太耗算力?手把手拆解Restormer的MDTA与GDFN模块

本文深度解析了CVPR2022最佳论文提名作品Restormer的创新模块MDTA与GDFN,有效解决了Transformer在计算机视觉领域的高计算复杂度问题。通过通道注意力降维和门控前馈网络设计,Restormer在图像恢复重建任务中显著降低计算量,同时保持高性能,为实时图像处理提供了可行方案。

weixin_30258901的博客 445

EDA虚拟机分享2020版本(Synopsys2020)

EDA虚拟机分享

亦安的数字小站 9189

力扣LeetCode2.两数相加及Python源码实现

本题为LeetCode题库中第2两数相加,难度中等,题目请参考这里。 比较绕的一道题,谈论区的python答案不多而且思路没有讲清楚,这里记录一下。 给出两个非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字。 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。 您可以假设除了数字 0 之外,这两个数...

Alex__Mahone的专栏 794

思科模拟器CIsco Packet Tracer利用三层交换机实现VLAN间路由

版权声明:如果对大家有帮助,大家可以自行转载的。 1.技术原理: 三层交换机具备网络层的功能,实现 VLAN 相互访问的原理是:利用三层交换机的路由功能,通过识别数据包的 IP 地址,查找路由表进行选路转发,三层交换机利用直连路由可以实现不同 VLAN 之间的相互访问。三层交换机给接口配置 IP 地址。采用 SVI(交换虚拟接口)的方式实现 VLAN 间互连。SVI 是指为交换机中的VLAN 创建...

qq_37992321的博客 1万+

力扣LeetCode第2题两数相加

力扣LeetCode第2题两数相加

weixin_44061444的博客 384

基于DPLL算法解决3-SAT问题(C++实现)

近日看到一个3-SAT问题(Boolean SATisfiability Problem, 布尔逻辑可满足性问题),试着写了个算法求解。

qq_63241496的博客 2215

Silvaco TCAD仿真例库——肖特基二极管反向击穿特性(案例)

本文详细介绍了使用Silvaco TCAD仿真例库分析肖特基二极管反向击穿特性的完整流程。通过搭建带保护环的器件结构,配置关键物理模型,并执行反向偏压扫描,深入探讨了雪崩击穿机制、电场分布及设计参数(如漂移区浓度、保护环)对击穿电压的影响,为功率半导体设计与可靠性分析提供了实用的虚拟实验方法。

weixin_29165465的博客 389

力扣2. 两数相加

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

小麦China的博客 198

通信工程学习:什么是ASK振幅键控、FSK频移键控、PSK相移键控

ASK、FSK和PSK是三种基础数字调制技术。ASK通过改变载波振幅传输信息,实现简单但抗干扰弱;FSK利用频率变化传递信号,抗干扰较强但频谱利用率一般;PSK通过相位变化编码数据,抗干扰和频谱效率最优但同步要求高。三种技术各具特点,分别适用于不同通信场景:ASK用于低速光纤通信,FSK常见于无线广播,PSK则广泛应用于Wi-Fi、蓝牙等现代通信系统。

limengshi138392的博客 8719

力扣leetcode题库练习(C++)—2.两数相加

力扣leetcode题库练习(C++)—2.两数相加题目描述示例分析代码及注释如下结果如下 题目描述 给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。 您可以假设除了数字 0 之外,这两个数都不会以 0 开头。 示例 输入:(2 -> 4 ...

weixin_45682431的博客 856

【网络安全】基于Python的威胁情报自动推送系统设计与实现(含源码)

本文介绍了一个基于 Python 开发的威胁情报自动推送系统的设计与实现。该系统通过集成 AbuseIPDB 威胁情报数据源与即时通讯平台,实现了恶意 IP 地址的自动化采集、筛选与实时推送功能。文章详细阐述了系统的技术架构、核心算法、数据流转过程以及关键代码实现。系统采用多线程并发架构,通过 Long Polling 技术实现实时消息接收,支持自动推送和交互式查询两种工作模式。文章还提供了完整的部署指南和使用说明,包括环境配置、运行方式等内容。

等风来 312

55、Mac OS X 10.2 安装、设置、卸载及故障排除全攻略

本博客全面解析了 Mac OS X 10.2 的安装、设置、卸载及故障排除方法。内容涵盖四种安装方式的适用场景及操作步骤、设置助手的详细配置流程、卸载注意事项与恢复建议,以及常见问题和进阶故障的解决办法。通过图文并茂的形式,帮助用户快速掌握 Mac OS X 10.2 的基础与高级操作,是使用该操作系统的实用指南。

qsc90123456的博客 151

Leetcode力扣2两数相加

两数相加 请你将两个数相加,并以相同形式返回一个表示和

Solaku7的博客 312

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

【力扣LeetCode】2 两数相加(链表)

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

Jiewang的博客 306

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Leetcode力扣——2. 两数相加

Leetcode力扣——2. 两数相加 给你两个的链表,表示两个非负的整数。它们每位数字都是按照的方式存储的,并且每个节点只能存储数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。...

qq_52222102的博客 1708

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

2. 两数相加 - 力扣(LeetCode)

在上面的代码中,我们使用了一个哑节点(dummy)来简化链表的创建过程,因为我们不需要在循环开始前就知道链表的长度。哑节点是一个特殊的节点,它不包含任何数据(或包含默认值,如0),但它的下一个节点是结果链表的第一个实际节点。在循环结束后,我们返回哑节点的下一个节点作为结果链表的头节点。想象一下,你有两个逆序的纸条,每个纸条上都写着一串数字,这些数字代表一个非负的整数,但是是从低位到高位排列的(也就是个位数在最前面,十位数在后面,依此类推)。方法来得到相加后的结果链表,最后打印了结果链表的内容。

it爱好者的学习之路 1138

2. 两数相加 - 力扣(LeetCode)

每次将两个节点的值与进位值相加,计算当前节点的值和新的进位值。使用哑巴节点简化链表的构建过程,确保所有边界情况(如链表长度不一致和最后的进位)都被正确处理。​ 将链表反过来看:这道题思路是通过迭代的方式将两个链表表示的数字相加,并返回结果链表。通过迭代的方式遍历链表。​ 你可以假设除了数字 0 之外,这两个数都不会以 0 开头。​ 请你将两个数相加,并以相同形式返回一个表示和的链表。的链表,表示两个非负的整数。它们每位数字都是按照。的方式存储的,并且每个节点只能存储。

q1111111da的博客 582

2. 两数相加【 力扣(LeetCode) 】

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

yyh520025的博客 580

力扣(leetcode 2)两数相加 python

题目 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/add-two-numbers 给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。 您可以假设除了数字 0 之外,这两个数都不会以 0 开...

qq_41318002的博客 531

leetcode力扣 2 两数相加 链表

如果头节点不为零,则开辟空间给tail-next的值赋值为余数,并且tail指向tail->next,carry的值赋值为sum除10,遍历l1 l2两条链表。使两个链表不为空为循环条件,将变量n1 n2以两条链表头节点为值,进行求和sum,如果头节点为零,则开辟一个空间,尾部值使它是总和的余数,并将next域置空;1 将长度较短的链表在末尾补零使得两个连表长度相等,再一个一个元素对其相加(考虑进位)的链表,表示两个非负的整数。请你将两个数相加,并以相同形式返回一个表示和的链表。3 在较短的链表末尾补零。

CKROL的博客 223

2.力扣LeetCode_两数相加

该代码实现了两个逆序存储数字的链表相加。主要思路是:使用哑节点简化链表操作,同时遍历两个链表,逐位相加并处理进位。创建新节点存储个位结果,将十位作为进位。若最终仍有进位,则额外创建节点。使用尾插法构建结果链表,最后释放哑节点内存。时间复杂度O(max(m,n)),空间复杂度O(max(m,n)),其中m,n为两个链表的长度。

2401_82472941的博客 614

leetcode/力扣第2题 两数相加

链表(Linked List)是一种线性数据结构数组:一块连续的内存,所有元素挨着存放,访问时可以通过下标快速找到。链表:由一个个“节点”(Node)组成,每个节点分为两部分:数据(值)指针(指向下一个节点的地址)就像一串珠子,节点靠“线”(指针)串起来。

m0_49366142的博客 348
上一篇: leetcode 21.合并两个有序链表
下一篇: leetcode 349.两个数组的交集
黑暗主宰
博客等级 码龄9年 72粉丝 169原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值