合并两个升序数组为新升序数组:我的Python函数存在什么遗漏?
你的代码存在三个关键问题
问题1:满足el > ins[c]时,未将当前el加入结果
当处理main中的元素el且el大于ins[c]时,代码只插入了ins中符合条件的元素,但没有把当前的el添加到结果列表。比如示例中的8会被跳过,不会出现在最终结果里。
问题2:内部循环错误遍历整个ins列表
你在处理el > ins[c]时,用for j, ins_el in enumerate(ins)遍历了整个ins,而非从当前指针c的位置开始。这会导致重复处理已经添加过的元素,比如示例中处理12时,会重新把5再添加一遍,造成结果重复。
问题3:未处理main遍历完成后ins中剩余的元素
如果ins中存在比main所有元素都大的元素(比如ins是[13,14]),当main遍历完后,这些元素根本不会被加入结果列表。
修正后的代码(双指针写法)
用双指针分别遍历两个有序列表,每次取较小的元素加入结果,最后拼接剩余元素,这是合并两个有序列表的标准高效写法:
def insarrintomain(main, ins): i = j = 0 result = [] # 同时遍历两个列表,取较小元素加入结果 while i < len(main) and j < len(ins): if main[i] <= ins[j]: result.append(main[i]) i += 1 else: result.append(ins[j]) j += 1 # 拼接main中剩余的元素 result.extend(main[i:]) # 拼接ins中剩余的元素 result.extend(ins[j:]) return result
测试你的示例:
main = [1, 2, 3, 4, 8, 9, 12] ins = [5, 6, 7, 10] print(insarrintomain(main, ins)) # 输出: [1,2,3,4,5,6,7,8,9,10,12]
内容的提问来源于stack exchange,提问作者Timur
相关产品推荐
相关产品推荐

