2. 两个数相加 [leetcode 2: Add Two Numbers]

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zgwangbo/article/details/84194197

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.1 如果没有进位, 则计算完成. 如: 123 + 456
  • 1.2 如果最后一位还有进位, 则要在返回结果中, 增加一个结点记录进位结果. 如: 1 + 9
  1. 如果其中一个到达结尾, 另外一个还有剩余:
  • 2.1 如果没有进位, 则可以直接将剩余链表拼接在结果上. 如: 1 + 23
  • 2.2 如果有进位, 则需要将剩余的结果依次进行进位加法操作, 计算出结果. 如: 1 + 999

其实测试的case中, 专门有测试进位的操作, 所以大家务必小心.

完整代码请点击这里: 完整代码

知识扩展

其实这个题目是最简单的多路归并算法的特例.

多路归并: 就是有多条链式结构, 需要根据一定的规则, 把他们合并为一条结果链进行返回.

这样说可能太抽象, 我们举一个具体的应用场景:搜索引擎的搜索操作.

大家去搜索引擎搜索一个东西, 一般数据都是存储在多台服务器上, 当查询达到的时候, 多个服务器都会根据关键字对本机的数据进行查找, 然后将结果返回给一台数据合并机, 这台机器就拿着多个返回的结果链, 按一定的优先级, 对结果进行合并, 最后形成一个优化的结果链, 返回给调用的服务器.

这里数据合并机所用的算法, 就含有多路归并.

所以, 我们平时学的这些算法, 在实际生成当中, 还是有一点点用处的~~


好了, 这一题就分析到这里. 如果觉得老王的讲解有意思或有帮助, 可以给老王点个赞或者打个赏啥的, 老王就很开心啦~

咱下一题继续~~

猜你喜欢

转载自blog.csdn.net/zgwangbo/article/details/84194197