【技术分享-真题实战】两数相加(Java)

简介: 【题目来源:leetcode-2】链表存储、数学、循环

题目详情

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

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

你可以假设除了数字 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、两个非空链表,逆序存储

2、要求两个链表对应的节点的值相加

3、使用链表来存储最后的和

4、如果两数相加大于10有进位怎么存?



做题思路

首先需要定义一个链表节点类

将对应链表节点的值进行相加,如果和没有超过10,直接存入新节点中,如果超过10,进行进位,小于10的那部分存储到节点中

观察示例3,两个长度不一样的数,他是怎么加的?

首先将两个链表对齐

  9 9 9 9 9 9 9

           9 9 9 9

 ————————

1 0 0 0 9 9 9 8

然后逆序存入链表。

其实就是原数高位对齐 ,在较短的数的高位前面补0


自己多写几个例子会发现 l1 按顺序  + l2 的结果就是 l1原数 + l2原数 再逆序存储。

所以,如果两个链表长度不一致,直接在短的链表后面补0,即在短的数高位补0,求和不影响结果。


代码思路

classListNode{
//一个链表由两部分组成,节点的值、指向下一节点的指针intval;
ListNodenext;//指针//使用构造函数初始化链表节点的值ListNode(intval){
this.val=val;
    }
}
publicclasssolution{
//返回的值是一个链表,传入的参数是两个链表publicstaticListNodeaddTwoNum(ListNodel1,ListNodel2){
//初始化链表头节点ListNodehead=newListNode(0);
//定义一个指针指向头节点ListNodecurr=head;
//初始化进位为0intcarry=0;
//判断l1、l2是否循环结束while(l1!=null||l2!=null){
//进入循环说明肯定有一个链表还没循环完//进行判断,如果有短的,直接给他赋值0(补0操作)intx= (l1!=null)?l1.val : 0;
inty= (l2!=null)?l2.val : 0;
//计算两个链表节点的和,刚开始进位是0intsum=x+y+carry;
//判断进位的值,两位小于10的数相加,最大才18,判断是否有进位carry=carry/10;
//判断两个节点 + 进位的结果是否大于10,大于还需要进位//直接求余,若大于10 ,sum保存个位sum=sum%10; 
//把结果放入新链表中curr.next=newListNode(sum);
//指针移动到后一位curr=curr.next;
//判断l1节点是否为空if(l1!=null){
//l1若不为空,就节点后移,接着循环l1=l1.next;            }
//判断l2节点是否为空if(l2!=null){
l2=l2.next;
            }
        }
//循环结束//如果循环结束了,最后一次求和的结果大于10,需要在进位//此时直接使用新节点存储if(carry>0){
curr.next=newListNode(carry);
        }
//返回头节点的后一个节点(头节点是自己虚拟的)returnhead.next;
    }
}



难点:

想不到 两个链表直接相加得到的结果 就是 链表所对应的原来的数相加的结果 再 逆序

可以直接将题目简化为:对两个链表节点的值直接相加存储到新链表中

相关文章
|
11天前
|
缓存 负载均衡 Dubbo
Dubbo技术深度解析及其在Java中的实战应用
Dubbo是一款由阿里巴巴开源的高性能、轻量级的Java分布式服务框架,它致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。
35 6
|
13天前
|
Java
领略Lock接口的风采,通过实战演练,让你迅速掌握这门高深武艺,成为Java多线程领域的武林盟主
领略Lock接口的风采,通过实战演练,让你迅速掌握这门高深武艺,成为Java多线程领域的武林盟主
22 7
|
14天前
|
Java Android开发 C++
🚀Android NDK开发实战!Java与C++混合编程,打造极致性能体验!📊
在Android应用开发中,追求卓越性能是不变的主题。本文介绍如何利用Android NDK(Native Development Kit)结合Java与C++进行混合编程,提升应用性能。从环境搭建到JNI接口设计,再到实战示例,全面展示NDK的优势与应用技巧,助你打造高性能应用。通过具体案例,如计算斐波那契数列,详细讲解Java与C++的协作流程,帮助开发者掌握NDK开发精髓,实现高效计算与硬件交互。
54 1
|
21天前
|
存储 负载均衡 Java
Jetty技术深度解析及其在Java中的实战应用
【9月更文挑战第3天】Jetty,作为一款开源的、轻量级、高性能的Java Web服务器和Servlet容器,自1995年问世以来,凭借其卓越的性能、灵活的配置和丰富的扩展功能,在Java Web应用开发中占据了举足轻重的地位。本文将详细介绍Jetty的背景、核心功能点以及在Java中的实战应用,帮助开发者更好地理解和利用Jetty构建高效、可靠的Web服务。
32 2
|
25天前
|
Java 数据处理
技术分享:高效与灵活并存——Java版通用树形结构转换工具的实现与应用
在软件开发中,树形结构的数据表现形式无处不在,从文件系统的目录树到组织架构的部门树,再到各类产品的分类结构。处理这些具有层级关系的数据时,将其转换为树形结构以便展示和操作显得尤为重要。Java作为一门成熟的编程语言,虽然提供了强大的集合框架,但并未直接提供树形结构转换的内置工具。因此,开发一个高效且灵活的通用树形结构转换工具成为许多项目中的必备需求。
29 2
|
5天前
|
Java 数据中心 微服务
Java高级知识:线程池隔离与信号量隔离的实战应用
在Java并发编程中,线程池隔离与信号量隔离是两种常用的资源隔离技术,它们在提高系统稳定性、防止系统过载方面发挥着重要作用。
6 0
|
8天前
|
消息中间件 缓存 Java
RocketMQ的JAVA落地实战
RocketMQ作为一款高性能、高可靠、高实时、分布式特点的消息中间件,其核心作用主要体现在异步处理、削峰填谷以及系统解耦三个方面。
40 0
|
5天前
|
安全 Java 调度
Java编程时多线程操作单核服务器可以不加锁吗?
Java编程时多线程操作单核服务器可以不加锁吗?
18 2
|
9天前
|
存储 缓存 Java
java线程内存模型底层实现原理
java线程内存模型底层实现原理
java线程内存模型底层实现原理
|
14天前
|
缓存 Java 应用服务中间件
Java虚拟线程探究与性能解析
本文主要介绍了阿里云在Java-虚拟-线程任务中的新进展和技术细节。
下一篇
无影云桌面