每日一题(LeetCode)----链表--两数相加

news2024/9/24 18:53:14

每日一题(LeetCode)----链表–两数相加

1.题目(2. 两数相加)

  • 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

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

    你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

    示例 1:

    img

    输入:l1 = [2,4,3], l2 = [5,6,4]
    输出:[7,0,8]
    解释:342 + 465 = 807.
    

    示例 2:

    输入:l1 = [0], l2 = [0]
    输出:[0]
    

    示例 3:

    输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
    输出:[8,9,9,9,0,0,0,1]
    

    提示:

    • 每个链表中的节点数在范围 [1, 100]
    • 0 <= Node.val <= 9
    • 题目数据保证列表表示的数字不含前导零

2.解题思路

思路一

循环

1.先获取两个链表的长度,然后把较长链表作为我们的结果链表 2.创建一个记录进位的变量,用两个指针从头开始遍历两个链表每次遍历到的节点如果非空,那么把当前节点中的值和当前进位进行相加,如果和大于10,那么下一次的进位变为1,然后和减10,存到结果链表的对应节点中,一直遍历直到遍历完较长链表时结束,(为了之后我们添加新节点,所以遍历到较长链表的结尾时,我们用tail指针保存一下较长链表的结尾) 3.然后我们查看当前进位是否为0,如果不为零,那我们新创建一个节点,接到结果链表的后面操作结束,如果为零,那么不需要新创建一个节点,操作结束 4.返回新链表的头节点

思路二:递归

递归解法非常巧妙。

做递归题目一定要牢记「递归函数的定义」。

递归函数定义:addTwoNumbers 表示将两个链表 l1 和 l2 相加得到的新链表; 递归终止条件:如果 l1 和 l2 有一个为空,则返回另外一个。 递归函数内容:

把两个链表节点的值相加(结果记为 add )。把 add 模 10 作为当前的链表节点的值。
把两个链表的 next 节点相加。(注意:如果当前相加的结果 add>=10,需要把 next 节点相加得到的结果 + 1。)
递归解法妙在天然地处理好了两个链表不一样长、最终相加结果有进位的情况。

原作者:负雪明烛
链接:https://leetcode.cn/problems/add-two-numbers/

自己的理解:就是先从前到后先走一遍,算出所有的和作为答案,然后从后往前看有哪个和超过了10,超过了10就继续向后递归,但是递归的对象变为当前进位和它的下一位和,到了递归的终止条件之后,就继续向前返回

3.写出代码

思路一的代码
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        //先获取两个链表的长度
        int length1=0;
        int length2=0;
        ListNode* Temp1=l1;
        ListNode* Temp2=l2;
        int length=0;
        while(Temp1){
            length1++;
            Temp1=Temp1->next;
        }
        while(Temp2){
            length2++;
            Temp2=Temp2->next;
        }
        //判断那个链表长作为我们的结果链表
        ListNode* res1=nullptr;
        ListNode* res2=nullptr;
        if(length1>=length2){
            length=length1;
            res1=l1;
            res2=l2;
        }
        else{
            length=length2;
            res1=l2;
            res2=l1;
        }
        Temp1=res1;
        Temp2=res2;
        int carry=0;//记录进位的变量
        ListNode* Temp3=nullptr;//存的是较长链表的最后一个节点
        //两个链表对应的节点进行相加
        while(length--){
            int sum=0;
            if(Temp1&&Temp2){
                sum=Temp1->val+Temp2->val+carry;
            }
            else{
                sum=Temp1->val+carry;
            }
            carry=0;
            if(sum>=10){
                carry++;
                sum=sum-10;
                Temp1->val=sum;
            }
            else{
                Temp1->val=sum;
            }
            if(Temp1->next==nullptr){
                Temp3=Temp1;
            }
            Temp1=Temp1->next;
            if(Temp2){
                Temp2=Temp2->next;
            }
        }
        if(carry>0){
                ListNode* node=new ListNode(carry);
                Temp3->next=node;
                }
        return res1;
    }
};
思路二的代码
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        if (!l1) return l2;
        if (!l2) return l1;
        int target = l1->val + l2->val;
        ListNode* res = new ListNode(target % 10);
        res->next = addTwoNumbers(l1->next, l2->next);

        if (target >= 10){
            res->next = addTwoNumbers(res->next, new ListNode(1));
        }
        
        delete l1, l2;
        return res;
    }
};
原作者:负雪明烛
链接:https://leetcode.cn/problems/add-two-numbers/

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

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

相关文章

java飞翔的鸟

一.准备工作 首先创建一个新的Java项目命名为“飞翔的鸟”&#xff0c;并在src中创建一个包命名为“com.qiku.bird"&#xff0c;在这个包内分别创建4个类命名为“Bird”、“BirdGame”、“Column”、“Ground”&#xff0c;并向需要的图片素材导入到包内。 二.代码呈现 p…

Unity中Shader的Standard材质解析(一)

文章目录 前言一、在Unity中&#xff0c;按一下步骤准备1、在资源管理面板创建一个 Standard Surface Shader2、因为Standard Surface Shader有很多缺点&#xff0c;所以我们把他转化为顶点片元着色器3、整理只保留主平行光的Shader效果4、精简后的最终代码 前言 在Unity中&am…

Linux:文件系统初步理解

文章目录 文件的初步理解C语言中对文件的接口系统调用的接口位图的理解open调用接口 文件和进程的关系进程和文件的低耦合 如何理解一切皆文件&#xff1f; 本篇总结的是关于Linux中文件的各种知识 文件的初步理解 在前面的文章中有两个观点&#xff0c;1. 文件 内容 属性&…

MySQL数据库约束你真的懂吗?

✏️✏️✏️今天给各位带来的是关于数据库约束方面的知识 清风的CSDN博客 &#x1f61b;&#x1f61b;&#x1f61b;希望我的文章能对你有所帮助&#xff0c;有不足的地方还请各位看官多多指教&#xff0c;大家一起学习交流&#xff01; 动动你们发财的小手&#xff0c;点点关…

浅谈 JVM GC 收集器--系列(一)

又到一年大促时刻&#xff0c;今天我们一起探讨下JVM垃圾回收的问题&#xff0c;写代码的时候想一想如何减少FullGC问题的出现&#xff0c;因为一旦出现频繁FullGC&#xff0c;短时间内没有太好的解决办法&#xff0c;很有可能重启后服务接着FullGC&#xff0c;导致服务可用率降…

Vue3 + Vite + TSX + vue3-ace-editor 踩坑

前言 由于 ace-editor 官网并没有提供各个前端框架Vue&#xff0c;React&#xff0c;Angular的直接使用的适配版本&#xff0c; 所以本次使用的vue3-ace-editor 是个人开源者维护的版本&#xff0c;原生是支持 SFC 模版用的&#xff0c;由于我这里习惯使用 JSX 或 TSX的方式&a…

NSGA-III求解微电网多目标优化调度(MATLAB)

一、NSGA-III简介 NSGA-III算法由Kalyanmoy Deb和Himanshu Jain于 2014年提出。 参考文献&#xff1a;Deb K , Jain H . An Evolutionary Many-Objective Optimization Algorithm Using Reference Point-Based Nondominated Sorting Approach, Part I: Solving Problems With …

Keil Vision5—新建工程project

注意&#xff1a;创建的工程目录必须是纯英文目录 目录 1.开始配置 2.为该路径下新建个文件夹 3.选择器件 4.工程配置 4.右击魔术棒&#xff0c;设置参数 ​编辑 &#xff08;1&#xff09;target配置 &#xff08;2&#xff09;output配置 &#xff08;3&#xff09;c…

Springboot集成swagger之knife4j

knife4j的最终效果&#xff1a; 支持直观的入参介绍、在线调试及离线各种API文档下载。 1 引入pom <dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version>3.0.2</ver…

unity3d人物移动一段距离漂移/卡住/卡在最后一帧,站立状态没有动画

在idle1.fbx中动画机选择循环播放&#xff0c;人物静止时播放休闲动画&#xff0c;移动时不停播放run动画

OpenStack云计算平台-认证服务

目录 一、认证服务概览 二、安装和配置 1、先决条件 2、安全并配置组件 3、 配置 Apache HTTP 服务器 4、完成安装 三、创建服务实体和API端点 1、先决条件 2、创建服务实体和API端点 四、创建域、项目、用户和角色 五、验证操作 六、创建 OpenStack 客户端环境脚本…

【理解ARM架构】操作寄存器实现UART | 段的概念 | IDE背后的命令

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《理解ARM架构》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 目录 &#x1f360;操作寄存器实现UART&#x1f35f;UART原理&#x1f35f;编程 &#x1f360;…

数据结构(超详细讲解!!)第二十四节 二叉树(下)

1.遍历二叉树 在二叉树的一些应用中&#xff0c;常常要求在树中查找具有某种特征的结点&#xff0c;或者对树中全部结点逐一进行某种处理。这就引入了遍历二叉树的问题&#xff0c;即如何按某条搜索路径访问树中的每一个结点&#xff0c;使得每一个结点仅且仅被访问一次。 …

Vue3 响应式数据 reactive使用

ref 与 reactive 是 vue3 提供给我们用于创建响应式数据的两个方法。 reactive 常用于创建引用数据&#xff0c;例如&#xff1a;object、array 等。 reactive 则是通过 proxy 来实现的响应式数据&#xff0c;并配合 reflect 操作的源对象。 reactive 创建引用数据&#xff1…

外汇天眼:外汇市场中的点差是什么? 又该怎么计算呢?

今天为大家揭开外汇点差的神秘面纱&#xff0c;了解这一外汇交易的核心概念。 定义 外汇点差&#xff0c;简单来说&#xff0c;就是外汇市场上买卖双方报价的差异。 每一笔交易由买卖报价中高低不同的部分构成&#xff0c;高出的部分是买方的盈利&#xff0c;低出的部分则是卖…

docker部署微服务

目录 docker操作命令 镜像操作命令 拉取镜像 导出镜像 删除镜像 加载镜像 推送镜像 部署 pom文件加上 在每个模块根目录加上DockerFile文件 项目根目录加上docker-compose.yml文件 打包&#xff0c;clean&#xff0c;package 服务器上新建文件夹 测试docker-compo…

OpenStack云计算平台-Dashboard(图形化)

目录 一、安装和配置 1、安全并配置组件 2、完成安装 ​二、验证操作 一、安装和配置 1、安全并配置组件 安装软件包&#xff1a; yum install openstack-dashboard 编辑文件 vim /etc/openstack-dashboard/local_settings vim /etc/httpd/conf.d/openstack-dashboard.…

PPP/INS紧组合算法

前言&#xff1a;在学习紧组合之前学会GNSS/INS松组合是很有必要的&#xff0c;i2NAV团队开源的KF_GINS项目可以作为GNSS/INS松组合学习模板&#xff0c;本文章主要对武汉大学i2NAV发布的PPP/INS紧组合学习资源进行算法层面的总结&#xff0c;链接&#xff1a; 武汉大学多源智…

聚类笔记/sklearn笔记:Affinity Propagation亲和力传播

1 算法原理 1.1 基本思想 将全部数据点都当作潜在的聚类中心(称之为 exemplar )然后数据点两两之间连线构成一个网络( 相似度矩阵 )再通过网络中各条边的消息( responsibility 和 availability )传递计算出各样本的聚类中心。 1.2 主要概念 Examplar聚类中心similarity S(i…

软件工程——数据流图(20分把握在自己手里)【言简意赅】

数据流图【DFD -> Data Flow Diagram】 确定外部实体&#xff1a; 在一个对于某系统的描述中&#xff0c;我们需要分辨的是&#xff0c;该系统的使用人员(或外部设备)&#xff0c;以及系统所反馈的人员(或外部设备)是谁&#xff1f; 这就是外部实体&#xff01;与系统内部处…