算法题解记录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

相关文章

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

dp算法练习题【8】

不同二叉搜索树 96. 不同的二叉搜索树 给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。 示例 1: 输入:n = 3输出:5 示例 2: 输入:n = 1输出:1 class Solution {public int numTrees(int n) {int[] dp = new int