2. 两个数相加 [leetcode 2: Add Two Numbers]
Posted 简单的老王
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2. 两个数相加 [leetcode 2: Add Two Numbers]相关的知识,希望对你有一定的参考价值。
2. 两个数相加 [leetcode 2: Add Two Numbers]
原题链接
https://leetcode.com/problems/add-two-numbers
老王的解法链接
https://github.com/simplemain/leetcode/blob/master/2/analysis.md
难度
★☆☆☆☆
标签
链表
题目描述
输入两个非空的链表
代表两个非负整数
. 不过数字是反向存储
的, 链表的每一个结点含有一个一位数
. 把这两个数字加起来
, 并返回一个链表
.
说明: 可以认为这两个数都没有前导零
, 数字0
本身除外.
输入样例
l1: (2 -> 4 -> 3)
l2: (5 -> 6 -> 4)
说明: 第一个数实际是倒过来的342, 第二个数则是465
输出样例
7 -> 0 -> 8
因为: 342 + 465 = 807, 然后倒过来输出返回
解法分析
这个题目实际上就是要考察最基本的链表操作. 这里的关键解法, 就是两个指针
分别指向两个链表, 然后同时往前
移动, 进行加法操作, 直到至少其中一个已经走完了. 如果还有一个剩余没有走完, 则把剩余的加入到返回结果中.
这里面要考虑以下几种情况:
- 两个指针
同时到达
两个链表的最后一个元素:
- 1.1 如果没有进位, 则计算完成. 如: 123 + 456
- 1.2 如果最后一位还有进位, 则要在返回结果中, 增加一个结点记录进位结果. 如: 1 + 9
- 如果
其中一个
到达结尾, 另外一个还有剩余:
- 2.1 如果没有进位, 则可以直接将剩余链表拼接在结果上. 如: 1 + 23
- 2.2 如果有进位, 则需要将剩余的结果依次进行进位加法操作, 计算出结果. 如: 1 + 999
其实测试的case中, 专门有测试进位的操作, 所以大家务必小心.
完整代码请点击这里: 完整代码
知识扩展
其实这个题目是最简单的多路归并
算法的特例.
多路归并
: 就是有多条链式结构
, 需要根据一定的规则, 把他们合并为一条
结果链进行返回.
这样说可能太抽象, 我们举一个具体的应用场景:搜索引擎
的搜索操作.
大家去搜索引擎搜索一个东西, 一般数据都是存储在多台服务器上, 当查询达到的时候, 多个服务器
都会根据关键字对本机的数据
进行查找, 然后将结果返回给一台数据合并机
, 这台机器就拿着多个返回的结果链
, 按一定的优先级, 对结果进行合并, 最后形成一个优化的结果链
, 返回给调用的服务器.
这里数据合并机
所用的算法, 就含有多路归并
.
所以, 我们平时学的这些算法, 在实际生成当中, 还是有一点点用处的~~
好了, 这一题就分析到这里. 如果觉得老王的讲解有意思或有帮助, 可以给老王点个赞或者打个赏啥的, 老王就很开心啦~
咱下一题继续~~
以上是关于2. 两个数相加 [leetcode 2: Add Two Numbers]的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 2. Add Two Numbers(两数相加)
LeetCode 2:两数相加 Add Two Numbers