LeetCode.2-两个数字相加(Add Two Numbers)
这是悦乐书的第340次更新,第364篇原创
01 看题和准备
今天介绍的是LeetCode算法题中Medium级别的第1题(顺位题号是2)。给定两个非空链表,表示两个非负整数。 数字以相反的顺序存储,每个节点包含一个数字。将两个数字相加并将其作为链表返回。你可以假设这两个数字不包含任何前导零,除了数字0本身。例如:
输入:(2 -> 4 -> 3)+(5 -> 6 -> 4)
输出:7 -> 0 -> 8
说明:342 + 465 = 807。
本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。
02 第一种解法
计算链表的节点值之和,包含以下两种情况:
进位。两个节点值相加大于等于10后,会产生进位问题,需要将进位产生的数加到下一轮计算上去。如果是在最后一次计算产生进位,结果链表需要增加一个next节点。
两链表的长度不相等时,可能会有一个链表先遍历完节点,而另外一个还剩下许多节点没遍历,因此在遍历的循环条件处,判空是或的关系,直到两个链表的节点都遍历完,才结束循环。
在此解法中,我们使用一个新的链表(头节点值为0)作为结果链表,使用一个boolean类型的变量flag来当做是否有进位的标志。
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode result = new ListNode(0);
ListNode tem = l1;
ListNode tem2 = l2;
ListNode current = result;
boolean flag = false;
while (tem != null || tem2 != null) {
// 计算节点值之和,需要判空
int sum = (tem != null ? tem.val : 0) +
(tem2 != null ? tem2.val : 0);
// 有进位,节点值之和加1,flag变为false
if (flag) {
sum += 1;
flag = false;
}
// 节点值之和大于等于10,只保留个位数,flag变为true
if (sum >= 10) {
sum -= 10;
flag = true;
}
current.next = new ListNode(sum);
current = current.next;
if (tem != null) {
tem = tem.next;
}
if (tem2 != null) {
tem2 = tem2.next;
}
}
// 尾节点可能因进位而产生
if (flag) {
current.next = new ListNode(1);
}
return result.next;
}
03 第二种解法
思路和上面一样,只是将计算进位换了一种方式来实现,采用了取余和整除的方式来实现。
public ListNode addTwoNumbers2(ListNode l1, ListNode l2) {
ListNode result = new ListNode(0);
ListNode temp = result;
int count = 0;
while (l1 != null || l2 != null) {
int sum = (l1 == null ? 0 : l1.val) +
(l2 == null ? 0 : l2.val);
sum += count;
count = sum/10;
temp.next = new ListNode(sum%10);
temp = temp.next;
if (l1 != null) {
l1 = l1.next;
}
if (l2 != null) {
l2 = l2.next;
}
}
if (count > 0) {
temp.next = new ListNode(count);
}
return result.next;
}
04 第三种解法
使用递归。
public ListNode addTwoNumbers3(ListNode l1, ListNode l2) {
ListNode result = new ListNode(0);
helper(result, l1, l2, 0);
return result.next;
}
/**
* 递归方法
* @param result 结果链表
* @param l1
* @param l2
* @param carry 进位产生的数
*/
public void helper(ListNode result, ListNode l1, ListNode l2, int carry) {
if (l1 == null && l2 == null) {
return ;
}
int sum = (l1 == null ? 0 : l1.val) +
(l2 == null ? 0 : l2.val);
sum += carry;
carry = sum/10;
result.next = new ListNode(sum%10);
result = result.next;
if (l1 != null) {
l1 = l1.next;
}
if (l2 != null) {
l2 = l2.next;
}
if (l1 == null && l2 == null && carry > 0) {
result.next = new ListNode(carry);
}
helper(result, l1, l2, carry);
}
05 第四种解法
对上面的递归方法,我们还可以再简化下,不借助额外的递归方法,以此方法本身做递归。
public ListNode addTwoNumbers4(ListNode l1, ListNode l2) {
if (l1 == null && l2 == null) {
return null;
}
int val = (l1 == null ? 0 : l1.val) +
(l2 == null ? 0 : l2.val);
ListNode result = new ListNode(val%10);
result.next = addTwoNumbers4(l1 == null ? null : l1.next,
l2 == null ? null : l2.next);
if (val >= 10) {
result.next = addTwoNumbers4(result.next, new ListNode(1));
}
return result;
}
06 小结
算法专题目前已连续日更超过六个月,算法题文章209+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。
以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!
LeetCode.2-两个数字相加(Add Two Numbers)的更多相关文章
- [LeetCode] Add Two Numbers 两个数字相加
You are given two linked lists representing two non-negative numbers. The digits are stored in rever ...
- [LeetCode] 2. Add Two Numbers 两个数字相加 java语言实现 C++语言实现
[LeetCode] Add Two Numbers 两个数字相加 You are given two non-empty linked lists representing two non-ne ...
- [LeetCode] 2. Add Two Numbers 两个数字相加
You are given two non-empty linked lists representing two non-negative integers. The digits are stor ...
- [CareerCup] 2.5 Add Two Numbers 两个数字相加
2.5 You have two numbers represented by a linked list, where each node contains a single digit. The ...
- LeetCode 2. 两数相加(Add Two Numbers)
2. 两数相加 2. Add Two Numbers 题目描述 You are given two non-empty linked lists representing two non-negati ...
- [LintCode] Add Two Numbers 两个数字相加
You have two numbers represented by a linked list, where each node contains a single digit. The digi ...
- [Swift]LeetCode2. 两数相加 | Add Two Numbers
You are given two non-empty linked lists representing two non-negative integers. The digits are stor ...
- LeetCode第[2]题(Java):Add Two Numbers (链表相加)——Medium
题目难度:Medium 题目: You are given two non-empty linked lists representing two non-negative integers. The ...
- 2.两数相加(Add Two Numbers) C++
第一想法是顺着题目的原因,将两链表分别转化为一个数字,再将数字相加,然后把结果转化为字符串,存到答案链表中.但是数据太大会溢出! 所以,要在计算一对数字的过程当中直接存储一个结果,注意结果大于9时进位 ...
随机推荐
- Azure Service Bus
Azure Service Bus 是类似Rabbit的一个队列的应用. 找了两个基本的教程 First(但是这个,没有写怎么去链接账户) Sec:这个有 Third(讲的也很好) Windo ...
- Deutsch lernen (12)
1. hinweisen - wies hin - hingewiesen 向...指出,指明 auf etw.(A) hinweisen Ich möchte (Sie) darauf hiweis ...
- jenkins如何实现重新发布历史构建记录里的版本
Jenkins以前打包都会将打出的拷贝放到历史版本里放到Daily_Result里,昨天不只是误操作还是系统问题,误将一个历史版本的包删掉了,而且这个包是之前比较稳定的一个版本,需要重新给客户发,所以 ...
- Java中final,finally和finalize区别
Day11_SHJavaTraing_4-18-2017 Java中final,finally和finalize区别 1.final—修饰符(关键字) ①final修饰类,表示该类不可被继承 ②fin ...
- WebGL画点程序v2
本文程序实现画一个点的任务,如下图.其中,点的位置坐标由Javascript传到着色器程序中,而不是直接给定("硬编码")在顶点着色器中. 整个程序包含两个文件,分别是: 1. H ...
- Git更新代码
此次更新,创建新的文件与文件夹,并且删除了原有文件 通过“git status” 命令查看当前变更.通过变更信息可以看出,删除了test_case.py文件.这个删除只是在项目目录下进行删除,Git对 ...
- 详解CorelDRAW智能填充工具的运用
使用智能填充工具可以为任意的闭合区域填充颜色并设置轮廓.与其他填充工具不同,智能填充工具仅填充对象,它检测到区域的边缘并创建一个闭合路径,因此可以填充区域.例如,智能填充工具可以检测多个对象相交产生的 ...
- MATLAB图形界面设计(下)
文章参考Blue Mountain https://www.cnblogs.com/BlueMountain-HaggenDazs/p/4307777.html 一.菜单设计 1.建立菜单项 (1)建 ...
- [kernel]----理解kswapd的低水位min_free_kbytes
1. min_free_kbytes 先看官方解释: This is used to force the Linux VM to keep a minimum number of kilobytes ...
- 共享内存、网络(day13)
一.共享内存 .获取一个键值 ftok() .使用键值获取共享内存的id shmget() #include <sys/ipc.h> #include <sys/shm.h> ...