算法题解记录15+++两数相加(百日筑基)

2024-04-17 21:44

本文主要是介绍算法题解记录15+++两数相加(百日筑基),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目描述:

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

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

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

示例 1:

输入: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
  • 题目数据保证列表表示的数字不含前导零

解题准备:

        1.了解链表:

                链表是一种链式结构,其常用while进行遍历。

        2.理解题意:

                输入:题意有两个输入,链表l1的头节点l1,链表l2的头节点l2;;

                数据:题目涉及的数据“倒序”存储在链表中,也就是对于123,链表中是3->2->1。

                要求:返回一个同样格式的链表,其值为l1与l2相加

        3.了解可能存在的基础操作:

                首先,想要相加两个链表,得思考如何抽取出数据,因此大概率有遍历(查找)

                第二,既然要返回一个链表,我们得新生一个链表(也许可以在原链表l1或l2上操作,不过十分不建议),因此,大概率存在添加。

                总结,大概有查找、添加。

解题难点1分析:朴素的思路

                从朴素的角度理解,这道题可能分为三步:

                第一步,拿到链表l1、l2的数据。

                第二步,二者求和,得到data。【该步比较简单不讲解】

                第三步,对于data,生成新链表。

        难点1:如何获得其数据?

                从l1的角度,其每个结点的值为0到9,不过它们代表的数据不一致。

                比如链表l1为3->2->1;

                那么,3是个位数,2是十位数,1是百位数。

                因此,我们需要一个数据len,保存位数的数据。假设len初始为0,那么伪代码有:

//伪代码
// l1:3->2->1;
int len=0;
int data=0;
while(l1!=null){data += l1.val * Math.pow(10, len);l1=l1.next;
}

                经此,可以得到链表中存储的数据。

        思考题:如果链表中的数据,超出了int,甚至long的存储限制怎么办?(下面解答。)

        难点2:如何根据data,生成新链表?

                假设新链表代表的数据,是data,如何根据data生成新链表?

                要求是倒序排列,因此个数位在第一位,十位数在第二位,以此类推……

                如何拿到个位数?

                        取余操作,也是比较经典的基本操作。

                接着,我们借助一个len,可以很快生成新链表。伪代码如下:

// 伪代码
// 假设已经有data
ListNode result=new ListNode();
ListNode temp=result; // 避免头节点找不到while(true){temp.val=data%10;data=data/10;if(data>0){temp.next=new ListNode();temp=temp.next;}else{break;}
}return result;

        本解法,计算一次num1、一次num2,此时时间复杂度是O(n1+n2),又因为生成可能需要O(n1或n2【最大的】),所以总体为O(N)

解题难点2分析:更便捷的思路

        链表的每一个节点,其值为0到9,那么两个链表相加,对于任何一位,其结果最多是0到18,也就是最多进一位。

        如果把链表看成一个倒序的数组(或者直接看成数组),我们可以发现,把两个链表l1、l2对齐后,相加,只会有两种结果:值、值与进一位。

        如果l1、l2同时开始,同步前进,有可能会出现l1的长度小于l2,此时遍历完l1后,l1就没有数据了。

        因此,我们可能需要视情况补0,也就是认为,较小的那个链表,其后面全是0。

        这样,就可以满足题意。

代码:

​
/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode addTwoNumbers(ListNode l1, ListNode l2) {ListNode res, temp;boolean flag=false;int data=0;int n1, n2;res=new ListNode();temp=res;while(l1!=null||l2!=null){n1=l1==null?0:l1.val;n2=l2==null?0:l2.val;data=n1+n2;l1=l1==null?null:l1.next;l2=l2==null?null:l2.next;if(flag){data++;flag=false;}temp.val=data%10;if(data>=10){flag=true;}if(l1==null&&l2==null){break;}temp.next=new ListNode();temp=temp.next;}if(flag){temp.next=new ListNode();temp=temp.next;temp.val=1;}return res;}
}​

以上内容即我想分享的关于力扣热题15的一些知识。

        我是蚊子码农,如有补充,欢迎在评论区留言。个人也是初学者,知识体系可能没有那么完善,希望各位多多指正,谢谢大家。

这篇关于算法题解记录15+++两数相加(百日筑基)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/912934

相关文章

国内环境搭建私有知识问答库踩坑记录(ollama+deepseek+ragflow)

《国内环境搭建私有知识问答库踩坑记录(ollama+deepseek+ragflow)》本文给大家利用deepseek模型搭建私有知识问答库的详细步骤和遇到的问题及解决办法,感兴趣的朋友一起看看吧... 目录1. 第1步大家在安装完ollama后,需要到系统环境变量中添加两个变量2. 第3步 “在cmd中

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.

Spring Retry 实现乐观锁重试实践记录

《SpringRetry实现乐观锁重试实践记录》本文介绍了在秒杀商品SKU表中使用乐观锁和MybatisPlus配置乐观锁的方法,并分析了测试环境和生产环境的隔离级别对乐观锁的影响,通过简单验证,... 目录一、场景分析 二、简单验证 2.1、可重复读 2.2、读已提交 三、最佳实践 3.1、配置重试模板

在 Spring Boot 中使用异步线程时的 HttpServletRequest 复用问题记录

《在SpringBoot中使用异步线程时的HttpServletRequest复用问题记录》文章讨论了在SpringBoot中使用异步线程时,由于HttpServletRequest复用导致... 目录一、问题描述:异步线程操作导致请求复用时 Cookie 解析失败1. 场景背景2. 问题根源二、问题详细分

golang字符串匹配算法解读

《golang字符串匹配算法解读》文章介绍了字符串匹配算法的原理,特别是Knuth-Morris-Pratt(KMP)算法,该算法通过构建模式串的前缀表来减少匹配时的不必要的字符比较,从而提高效率,在... 目录简介KMP实现代码总结简介字符串匹配算法主要用于在一个较长的文本串中查找一个较短的字符串(称为

通俗易懂的Java常见限流算法具体实现

《通俗易懂的Java常见限流算法具体实现》:本文主要介绍Java常见限流算法具体实现的相关资料,包括漏桶算法、令牌桶算法、Nginx限流和Redis+Lua限流的实现原理和具体步骤,并比较了它们的... 目录一、漏桶算法1.漏桶算法的思想和原理2.具体实现二、令牌桶算法1.令牌桶算法流程:2.具体实现2.1

关于Spring @Bean 相同加载顺序不同结果不同的问题记录

《关于Spring@Bean相同加载顺序不同结果不同的问题记录》本文主要探讨了在Spring5.1.3.RELEASE版本下,当有两个全注解类定义相同类型的Bean时,由于加载顺序不同,最终生成的... 目录问题说明测试输出1测试输出2@Bean注解的BeanDefiChina编程nition加入时机总结问题说明

将sqlserver数据迁移到mysql的详细步骤记录

《将sqlserver数据迁移到mysql的详细步骤记录》:本文主要介绍将SQLServer数据迁移到MySQL的步骤,包括导出数据、转换数据格式和导入数据,通过示例和工具说明,帮助大家顺利完成... 目录前言一、导出SQL Server 数据二、转换数据格式为mysql兼容格式三、导入数据到MySQL数据

关于rpc长连接与短连接的思考记录

《关于rpc长连接与短连接的思考记录》文章总结了RPC项目中长连接和短连接的处理方式,包括RPC和HTTP的长连接与短连接的区别、TCP的保活机制、客户端与服务器的连接模式及其利弊分析,文章强调了在实... 目录rpc项目中的长连接与短连接的思考什么是rpc项目中的长连接和短连接与tcp和http的长连接短

Oracle查询优化之高效实现仅查询前10条记录的方法与实践

《Oracle查询优化之高效实现仅查询前10条记录的方法与实践》:本文主要介绍Oracle查询优化之高效实现仅查询前10条记录的相关资料,包括使用ROWNUM、ROW_NUMBER()函数、FET... 目录1. 使用 ROWNUM 查询2. 使用 ROW_NUMBER() 函数3. 使用 FETCH FI