《算法题》是个系列文章,题主要来自 LeetCode,每道题我尽量使用两种以上的方法来解决,一种是好理解,但是可能性能差,一种需要花点功夫理解,但是性能好,所以题均由 Python 实现
先看下题目要求
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
先看下如何构建链表
1 | #!/usr/bin/env python |
这道题,我们同样有两种方式。
先计算链表代表的数字,再计算并转为链表
从题目的说明,我们很容易得到计算逻辑,先计算链表代表的数字,相加,并转为链表
1 | #!/usr/bin/env python |
不过这个方法,有两次 while
循环,时间复杂度 O(n**2)
,我们看看是否有更好的写法。
直接计算并输出链表
再看下题目,发现结果链表的每位,都是传参的两个链表的每位相加得到的,比如
1 | 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) |
由此可以使用一次循环,直接计算每位数字并输出到链表
1 | #!/usr/bin/env python |
很显然,逻辑更简单,时间复杂度为 O(n)
,测试下时间
1 | #!/usr/bin/env python |
1 | $ python 2_add_two_numbers.py |
很显然,addTwoNumbers2
的运行速度更快
完整代码地址:https://github.com/wxnacy/study/blob/master/python/leetcode/2_add_two_numbers.py
该题来自 LeetCode