【发布时间】:2011-08-30 01:41:01
【问题描述】:
我正在处理Google's Python class exercises。其中一个练习是这样的:
给定两个按升序排序的列表,创建并返回按排序顺序排列的所有元素的合并列表。您可以修改传入的列表。理想情况下,解决方案应该在“线性”时间内工作,对两个列表进行一次遍历。
我想出的解决方案是:
def linear_merge(list1, list2):
list1.extend(list2)
return sorted(list1)
它通过了测试功能,但给出的解决方案是这样的:
def linear_merge(list1, list2):
result = []
# Look at the two lists so long as both are non-empty.
# Take whichever element [0] is smaller.
while len(list1) and len(list2):
if list1[0] < list2[0]:
result.append(list1.pop(0))
else:
result.append(list2.pop(0))
# Now tack on what's left
result.extend(list1)
result.extend(list2)
return result
作为解决方案的一部分包括以下内容:
注意:上面的解决方案有点可爱,但不幸的是 list.pop(0) 是 标准 python 列表实现的时间不是恒定的,所以 以上不是严格的线性时间。另一种方法使用 pop(-1) 来 从每个列表中删除最末端的元素,构建一个解决方案列表 是倒退的。然后使用 reversed() 将结果放回正确的位置 命令。该解决方案在线性时间内有效,但更丑陋。
为什么这两种解决方案如此不同?是我遗漏了什么,还是它们过于复杂?
【问题讨论】: