2. Add Two Numbers
问题描述
给定两个非空链表来表示两个非负整数。整数的数位反向存储,每个链表节点存储一个数字。将两个整数相加并以相同的格式返回结果。
例如:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
其实就是 342 + 465 = 807
解题思路
这个题目本身难度不大,不知道难度为什么是中等。我解题过程中主要的纠结点是对结果链表头部的处理,因为链表头部相对于其他节点比较特殊,需要单独考虑。其他没有发现什么难点,无非是对链表和指针的操作。
具体实现
对于链表头节点的问题,我选择创建一个空的头节点,这样可以统一处理头节点和其他节点,在最后返回时跳过空的头节点。
我的第一次实现:
1 | # Definition for singly-linked list. |
leetcode运行时间128ms。
第一次的实现表现不佳,用时排名接近50%。主要问题在于每次循环都用if/else判断lsum是否大于等于10,这样其实浪费了不少时间。那么我们能不能无论lsum是否小于10,都统一处理呢?可以!
优化后代码:
1 | # Definition for singly-linked list. |
leetcode运行时间96ms。
96ms的表现已经超越99.26%的实现。
超慢实现
1 | # Definition for singly-linked list. |
leetcode用时312ms。
这个超慢实现,我不太确定慢的原因。我觉得可能的原因有:
- 循环中的两个分支多数情况下都要经过,这限制了处理器的预执行优化,影响性能。
- 实现中有
print()
参考文档
- Leetcode国际版:https://leetcode.com/
- 可能漏掉某些参考文档,请作者联系添加引用或删除相关内容。