这是悦乐书的第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)的更多相关文章

  1. [LeetCode] Add Two Numbers 两个数字相加

    You are given two linked lists representing two non-negative numbers. The digits are stored in rever ...

  2. [LeetCode] 2. Add Two Numbers 两个数字相加 java语言实现 C++语言实现

    [LeetCode] Add Two Numbers 两个数字相加   You are given two non-empty linked lists representing two non-ne ...

  3. [LeetCode] 2. Add Two Numbers 两个数字相加

    You are given two non-empty linked lists representing two non-negative integers. The digits are stor ...

  4. [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 ...

  5. LeetCode 2. 两数相加(Add Two Numbers)

    2. 两数相加 2. Add Two Numbers 题目描述 You are given two non-empty linked lists representing two non-negati ...

  6. [LintCode] Add Two Numbers 两个数字相加

    You have two numbers represented by a linked list, where each node contains a single digit. The digi ...

  7. [Swift]LeetCode2. 两数相加 | Add Two Numbers

    You are given two non-empty linked lists representing two non-negative integers. The digits are stor ...

  8. LeetCode第[2]题(Java):Add Two Numbers (链表相加)——Medium

    题目难度:Medium 题目: You are given two non-empty linked lists representing two non-negative integers. The ...

  9. 2.两数相加(Add Two Numbers) C++

    第一想法是顺着题目的原因,将两链表分别转化为一个数字,再将数字相加,然后把结果转化为字符串,存到答案链表中.但是数据太大会溢出! 所以,要在计算一对数字的过程当中直接存储一个结果,注意结果大于9时进位 ...

随机推荐

  1. Azure Service Bus

    Azure Service Bus  是类似Rabbit的一个队列的应用. 找了两个基本的教程 First(但是这个,没有写怎么去链接账户)  Sec:这个有   Third(讲的也很好) Windo ...

  2. Deutsch lernen (12)

    1. hinweisen - wies hin - hingewiesen 向...指出,指明 auf etw.(A) hinweisen Ich möchte (Sie) darauf hiweis ...

  3. jenkins如何实现重新发布历史构建记录里的版本

    Jenkins以前打包都会将打出的拷贝放到历史版本里放到Daily_Result里,昨天不只是误操作还是系统问题,误将一个历史版本的包删掉了,而且这个包是之前比较稳定的一个版本,需要重新给客户发,所以 ...

  4. Java中final,finally和finalize区别

    Day11_SHJavaTraing_4-18-2017 Java中final,finally和finalize区别 1.final—修饰符(关键字) ①final修饰类,表示该类不可被继承 ②fin ...

  5. WebGL画点程序v2

    本文程序实现画一个点的任务,如下图.其中,点的位置坐标由Javascript传到着色器程序中,而不是直接给定("硬编码")在顶点着色器中. 整个程序包含两个文件,分别是: 1. H ...

  6. Git更新代码

    此次更新,创建新的文件与文件夹,并且删除了原有文件 通过“git status” 命令查看当前变更.通过变更信息可以看出,删除了test_case.py文件.这个删除只是在项目目录下进行删除,Git对 ...

  7. 详解CorelDRAW智能填充工具的运用

    使用智能填充工具可以为任意的闭合区域填充颜色并设置轮廓.与其他填充工具不同,智能填充工具仅填充对象,它检测到区域的边缘并创建一个闭合路径,因此可以填充区域.例如,智能填充工具可以检测多个对象相交产生的 ...

  8. MATLAB图形界面设计(下)

    文章参考Blue Mountain https://www.cnblogs.com/BlueMountain-HaggenDazs/p/4307777.html 一.菜单设计 1.建立菜单项 (1)建 ...

  9. [kernel]----理解kswapd的低水位min_free_kbytes

    1. min_free_kbytes 先看官方解释: This is used to force the Linux VM to keep a minimum number of kilobytes ...

  10. 共享内存、网络(day13)

    一.共享内存 .获取一个键值 ftok() .使用键值获取共享内存的id shmget() #include <sys/ipc.h> #include <sys/shm.h> ...