leecode445 两数相加II

445. 两数相加 II 这道题关键在于处理高位在前的链表加法。链表反转 + 头插构建结果链表是最直接且易实现的方式。对于追求空间效率或输入不能修改的场景,可以考虑栈或递归做法作为进阶练习。 阅读详情

在这里插入图片描述

我的思路

这个题目感觉非常不优雅,代码写的太多了,不过题目难度倒是不难,本质上就是先将两个链表翻转,然后逐个进行相加运算即可,重点在于需要定义一个尾指针,方便一个讲长的那个拼接到短的上。

同时还需要注意如果两个链表等长,但是有进位,需要用尾指针进行新建节点,而不能用遍历的时候节点。

class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode head1 = reverse(l1);
        ListNode head2 = reverse(l2);
    
        int a = 0,sum=0;
        ListNode pre1 = head1;
        ListNode pre2 = head2;
        ListNode tail = head1;
        while(pre1!=null&&pre2!=null){
            a = pre1.val+pre2.val+sum;
            sum =0;
            if(a>=10){
                a=a-10;
                sum=1;
            }
            pre1.val = a;
            tail = pre1;
            pre1 = pre1.next;
            pre2 = pre2.next;
        }
        if(pre2!=null){
            tail.next = pre2;
            pre1 = pre2;
        }
        while(sum==1){
            if(pre1!=null){
                a= pre1.val+sum;
                sum=0;
                if(a>=10){
                    a=a-10;
                    sum=1;
                }
                pre1.val = a;
                tail = tail.next;
                pre1 = pre1.next;
            }
            else{
                tail.next = new ListNode(1,null);
                break;
            }
        }
        return reverse(head1);
    }
    public ListNode reverse(ListNode head){
        ListNode temp = head;
        ListNode pre = null;
        while(head!=null){
            temp = head.next;
            head.next = pre;
            pre = head;
            head = temp;
        }
        return pre;
    }
}

灵神的思路

灵神是用递归来做的,不断调用这个addTwo方法。感觉 没有我的好明白。不过灵神的代码写的真优雅啊,我的代码就是一坨了,丑陋不堪。

class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        l1 = reverseList(l1);
        l2 = reverseList(l2); // l1 和 l2 反转后,就变成【2. 两数相加】了
        ListNode l3 = addTwo(l1, l2, 0);
        return reverseList(l3);
    }

    private ListNode reverseList(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }
        ListNode newHead = reverseList(head.next);
        head.next.next = head; // 把下一个节点指向自己
        head.next = null; // 断开指向下一个节点的连接,保证最终链表的末尾节点的 next 是空节点
        return newHead;
    }

    // l1 和 l2 为当前遍历的节点,carry 为进位
    private ListNode addTwo(ListNode l1, ListNode l2, int carry) {
        if (l1 == null && l2 == null) { // 递归边界:l1 和 l2 都是空节点
            return carry != 0 ? new ListNode(carry) : null; // 如果进位了,就额外创建一个节点
        }
        if (l1 == null) { // 如果 l1 是空的,那么此时 l2 一定不是空节点
            l1 = l2;
            l2 = null; // 交换 l1 与 l2,保证 l1 非空,从而简化代码
        }
        carry += l1.val + (l2 != null ? l2.val : 0); // 节点值和进位加在一起
        l1.val = carry % 10; // 每个节点保存一个数位
        l1.next = addTwo(l1.next, (l2 != null ? l2.next : null), carry / 10); // 进位
        return l1;
    }
}

作者:灵茶山艾府
链接:https://leetcode.cn/problems/add-two-numbers-ii/solutions/2328330/fan-zhuan-lian-biao-liang-shu-xiang-jia-okw6q/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
Proteus仿真——电压比较器 电压比较器是一种对输入信号进行鉴别与比较的电路,是组成非正弦波发生电路的基本单元电路。常用电压比较器有如下几种:单限比较器、滞回比较器、窗口比较器、集成电压比较器等。 阅读详情

相关推荐

2024银行科技岗笔试通关秘籍:从资料准备到实战技巧

本文系统解析了2024年银行科技岗笔试的考察内容与备考策略。文章指出,笔试是一场涵盖通用能力测试、计算机专业基础、金融科技知识和英语性格测试的复合型考试,并重点提供了数据结构与算法、计算机网络、数据库等高频考点的深度解析与实战突破技巧,帮助考生高效准备,顺利通关。

weixin_29243279的博客 121

Python | Leetcode Python题解之第445题两数相加II

Python | Leetcode Python题解之第445题两数相加II

Mopes__的博客 364

SpringBoot 中 @RequestMapping 及衍生注解的全面解析与实践

本文全面解析Spring Boot中@RequestMapping及其衍生注解的使用,涵盖核心功能、HTTP方法特定注解(@GetMapping/@PostMapping等)、属性详解(路径/参数/头信息等)以及路径变量处理。文章详细介绍了注解的组合使用、继承特性、版本控制策略等高级应用,并针对405/404等常见错误提供解决方案。通过学习这些注解的规范用法,开发者能够构建符合RESTful风格的API接口,提升代码可读性和可维护性。建议优先使用HTTP方法特定注解,合理规划URL结构,并注意避免路径冲突。

Java&AI小吕布的博客 2037

【LeetCode】445. 两数相加 II 解题报告 (python)

原题地址:https://leetcode-cn.com/problems/add-two-numbers-ii/submissions/ 题目描述: 给定两个非空链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储单个数字。将这两数相加会返回一个新的链表。 你可以假设除了数字 0 之外,这两个数字都不会以零开头。 进阶: 如果输入链表不能修改该如何处理?换句话...

暮雨凉初透 247

Unity中Newtonsoft.Json的使用(一)

在Unity中下载Newtonsoft.Json,并进行序列化和反序列化

洛苍离的博客 1万+

Revit二次开发——不启动Revit,做rvt文件数据导出

Revit二次开发——不启动Revit,做rvt文件数据导出Node.js部分调用C#端供外部调用的dllC#部分调用RevitNet.dll,做数据导出exe做外部调用dll总结功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 N

Y.Jerome的专栏 4110

LeetCode 445. 两数相加 II(C、C++、python)

给定两个非空链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储单个数字。将这两数相加会返回一个新的链表。 你可以假设除了数字 0 之外,这两个数字都不会以零开头。 进阶: 如果输入链表不能修改该如何处理?换句话说,你不能对列表中的节点进行翻转。 示例: 输入: (7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)...

qq_27060423的博客 676

[南大ICS-PA2] 字符串处理函数和printf实现

[南大ICS-PA2] 程序、运行时环境与AM 字符串处理函数和printf实现

qq_42474104的博客 2986

【python3】leetcode 445. Add Two Numbers II (Medium)

 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 t...

momottyy的专栏 357

RK3588网卡出现丢包或者带宽不足的问题验证排查

注意除了有最大的TCP数据接收缓冲,还有/proc/sys/net/core/wmem_max — 最大的TCP数据发送缓冲可以调整,这里暂时没用到,针对具体需要可适当调整。比如把ethx接口中断从默认的cpu0迁移到其它cpu,例如将eth0中断234移到cpu7 (10是16进制, cpu0 =3588的cpu有8个核,4个A55(小核)+4个A76(大核),可以找到对应中断 将中断从默认cpu0核切到cpu7。tcp_rmem:单位是字节,接收缓存区大小,缓存从对端接收的数据,后续会被应用程序读取。

Android/Linux驱动开发传帮带学习,让驱动入门门槛更低! 2027

Simulink仿真模块-Signal Generator

Signal Generator:生成各种波形 所在的位置库为:Simulink / Sources 模型为: 说明 Signal Generator模块可以产生四种不同波形: 正弦波 方波 锯齿波 随机 可以使用 hertz 或 rad/sec 为单位表示信号参数。双击模型可以选择需要生成的波形,如图所示: 使用默认参数值,可以获得下列波形之一: 波形 波形输出 正弦波 ...

jk_101的博客 2653

LeetCode445

给定两个非空链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储单个数字。将这两数相加会返回一个新的链表。   你可以假设除了数字 0 之外,这两个数字都不会以零开头。 进阶: 如果输入链表不能修改该如何处理?换句话说,你不能对列表中的节点进行翻转。 示例: 输入: (7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)...

LearnToStick的博客 850

PID、模糊PID、SkyHook、LQR、H2/H∞、ADRC等悬架控制合集

PID、模糊PID、SkyHook、LQR、H2/H∞等悬架控制合集

Mr.邹的博客 2013

LeeCode 445. 两数相加 II [中等 49.8%]

给定两个非空链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储单个数字。将这两数相加会返回一个新的链表。 你可以假设除了数字 0 之外,这两个数字都不会以零开头。 进阶: 如果输入链表不能修改该如何处理?换句话说,你不能对列表中的节点进行翻转。 示例: 输入: ...

chengyao8926的博客 189

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Statistics and Machine Learning Toolbox

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

leetcode:445. 两数相加 II

题目来源 445. 两数相加 II 题目描述 题目解析 反转链表 2. 两数相加 的扩展 /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { // 交换节点 public ListNode addTwoNum

OceanStar的博客 476

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

leetcode445. 两数相加 II

给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。 你可以假设除了数字 0 之外,这两个数字都不会以零开头。 进阶: 如果输入链表不能修改该如何处理?换句话说,你不能对列表中的节点进行翻转。 示例: 输入:(7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 8 -> 0 -> 7 思路:放入栈中再相加。 /** * Definit

少说,多做。 9948

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

LeetCode 445两数相加II

LeetCode 445两数相加IIMedium 题目简述:给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。你可以假设除了数字 0 之外,这两个数字都不会以零开头。 输入:(7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 8 -> 0 -> 7 思路:反转链表后从低位到高位依次相加,最后再反转新求和链表并返回结果 /** * Defi

XBlog 191

LeetCode###445. 两数相加 II

记录一下今日打卡 题号: 445. 两数相加 II 题目: 给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。 你可以假设除了数字 0 之外,这两个数字都不会以零开头。 进阶: 如果输入链表不能修改该如何处理?换句话说,你不能对列表中的节点进行翻转。 示例: 输入:(7 -> 2 ...

JavaPub 474

leetcode题:445. 两数相加 II(中等)

一、题目描述:445. 两数相加 II(中等) 给定两个非空链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储单个数字。将这两数相加会返回一个新的链表。 你可以假设除了数字 0 之外,这两个数字都不会以零开头。 进阶: 如果输入链表不能修改该如何处理?换句话说,你不能对列表中的节点进行翻转。 示例: 输入: (7 -> 2 -> 4 ->...

tankpanv的博客 257

[LeetCode 445]两数相加II

[LeetCode 445]C++实现两数相加II 给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。 你可以假设除了数字 0 之外,这两个数字都不会以零开头。 进阶: 如果输入链表不能修改该如何处理?换句话说,你不能对列表中的节点进行翻转。 示例: 输入:(7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 8 -> 0 -> 7 来源:力扣(Le

caser130的博客 126

LeetCode --- 445. 两数相加 II

LeetCode链接:445. 两数相加 II 解法1 - 递归版本 /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Sol...

宋卓的博客 214

LeetCode 445. 两数相加 II(Add Two Numbers II)

445. 两数相加 II 445. Add Two Numbers II 题目描述 给定两个非空链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储单个数字。将这两数相加会返回一个新的链表。 你可以假设除了数字 0 之外,这两个数字都不会以零开头。 进阶: 如果输入链表不能修改该如何处理?换句话说,你不能对列表中的节点进行翻转。 LeetCode445. Add Two Num...

weixin_30535043的博客 121

LeetCode刷题之T445两数相加 II(中等)

这次讲解的题目是LeetCode上的第T445两数相加 II(中等),其T2两数相加(中等)可参考:https://blog.youkuaiyun.com/Pzzzz_wwy/article/details/105519719 接下来上题: 节点的定义: 话不多说上思路: 首先我们得知道我们如果通过遍历,那么最先得到的就是较高位的值,然后再依次得到较低的值,然后按位置再相加后将值写到一个新的链表,接下来讲解...

Cocowwy的博客 334

445. 两数相加 II golang

题目 两数相加 II 给定两个非空链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储单个数字。将这两数相加会返回一个新的链表。 你可以假设除了数字 0 之外,这两个数字都不会以零开头。 进阶: 如果输入链表不能修改该如何处理?换句话说,你不能对列表中的节点进行翻转。 示例: 输入: (7 -> 2 -> 4 -> 3) + (5 -> 6 -&gt...

csdn_kou的博客 210

LeetCode第 445 题:两数相加 II(C++)

445. 两数相加 II - 力扣(LeetCode) 这儿的顺序与正常的相加不一样,使用栈倒腾一下就可以了。 class Solution { public: ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { stack<int> s1, s2; while(l1){ s1.push(l1->val); l1 = l1->next;

zj 285

LeetCode:445. 两数相加 II(C++带详细注释)

LeetCode:445. 两数相加 II(C++带详细注释) /** * 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

Axe涛的博客 200
上一篇: leecode25 K个一组翻转链表
下一篇: Transformer模型实战篇
TranquilGlow
博客等级 码龄5年 132粉丝 62原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值