【技术分享-真题实战】两数相加(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;
    }
}



难点:

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

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

相关文章
|
4月前
|
存储 Java 开发者
Java Map实战:用HashMap和TreeMap轻松解决复杂数据结构问题!
【10月更文挑战第17天】本文深入探讨了Java中HashMap和TreeMap两种Map类型的特性和应用场景。HashMap基于哈希表实现,支持高效的数据操作且允许键值为null;TreeMap基于红黑树实现,支持自然排序或自定义排序,确保元素有序。文章通过具体示例展示了两者的实战应用,帮助开发者根据实际需求选择合适的数据结构,提高开发效率。
109 2
|
10天前
|
存储 缓存 Java
Java中的分布式缓存与Memcached集成实战
通过在Java项目中集成Memcached,可以显著提升系统的性能和响应速度。合理的缓存策略、分布式架构设计和异常处理机制是实现高效缓存的关键。希望本文提供的实战示例和优化建议能够帮助开发者更好地应用Memcached,实现高性能的分布式缓存解决方案。
32 9
|
2月前
|
Java
Java基础却常被忽略:全面讲解this的实战技巧!
本次分享来自于一道Java基础的面试试题,对this的各种妙用进行了深度讲解,并分析了一些关于this的常见面试陷阱,主要包括以下几方面内容: 1.什么是this 2.this的场景化使用案例 3.关于this的误区 4.总结与练习
|
2月前
|
Java 程序员
Java基础却常被忽略:全面讲解this的实战技巧!
小米,29岁程序员,分享Java中`this`关键字的用法。`this`代表当前对象引用,用于区分成员变量与局部变量、构造方法间调用、支持链式调用及作为参数传递。文章还探讨了`this`在静态方法和匿名内部类中的使用误区,并提供了练习题。
50 1
|
3月前
|
安全 Java 开发者
Java 多线程并发控制:深入理解与实战应用
《Java多线程并发控制:深入理解与实战应用》一书详细解析了Java多线程编程的核心概念、并发控制技术及其实战技巧,适合Java开发者深入学习和实践参考。
87 7
|
3月前
|
存储 安全 Java
Java多线程编程中的并发容器:深入解析与实战应用####
在本文中,我们将探讨Java多线程编程中的一个核心话题——并发容器。不同于传统单一线程环境下的数据结构,并发容器专为多线程场景设计,确保数据访问的线程安全性和高效性。我们将从基础概念出发,逐步深入到`java.util.concurrent`包下的核心并发容器实现,如`ConcurrentHashMap`、`CopyOnWriteArrayList`以及`BlockingQueue`等,通过实例代码演示其使用方法,并分析它们背后的设计原理与适用场景。无论你是Java并发编程的初学者还是希望深化理解的开发者,本文都将为你提供有价值的见解与实践指导。 --- ####
|
4月前
|
开发框架 Java 程序员
揭开Java反射的神秘面纱:从原理到实战应用!
本文介绍了Java反射的基本概念、原理及应用场景。反射允许程序在运行时动态获取类的信息并操作其属性和方法,广泛应用于开发框架、动态代理和自定义注解等领域。通过反射,可以实现更灵活的代码设计,但也需注意其性能开销。
82 1
|
27天前
|
监控 Java
java异步判断线程池所有任务是否执行完
通过上述步骤,您可以在Java中实现异步判断线程池所有任务是否执行完毕。这种方法使用了 `CompletionService`来监控任务的完成情况,并通过一个独立线程异步检查所有任务的执行状态。这种设计不仅简洁高效,还能确保在大量任务处理时程序的稳定性和可维护性。希望本文能为您的开发工作提供实用的指导和帮助。
85 17
|
2月前
|
Java
Java—多线程实现生产消费者
本文介绍了多线程实现生产消费者模式的三个版本。Version1包含四个类:`Producer`(生产者)、`Consumer`(消费者)、`Resource`(公共资源)和`TestMain`(测试类)。通过`synchronized`和`wait/notify`机制控制线程同步,但存在多个生产者或消费者时可能出现多次生产和消费的问题。 Version2将`if`改为`while`,解决了多次生产和消费的问题,但仍可能因`notify()`随机唤醒线程而导致死锁。因此,引入了`notifyAll()`来唤醒所有等待线程,但这会带来性能问题。
Java—多线程实现生产消费者
|
23天前
|
缓存 安全 算法
Java 多线程 面试题
Java 多线程 相关基础面试题