我的目标是创建一个函数,它将2个已排序的int列表作为参数 并创建一个已排序的合并列表。唯一的问题是我不被允许 修改2个原始列表(并且不能重复修改)。只有允许的内置函数是range(),len(),index(),append()。到目前为止,我很难过。
这就是我所拥有的:
def merge_lists( list1, list2 ):
sortedList = []
pointer1 = 0
pointer2 = 0
while pointer1 < len( list1 ) and pointer2 < len( list2 ):
if list1[ pointer1 ] < list2[ pointer2 ]:
sortedList.append( list1[ pointer1 ] )
pointer1 += 1
elif list2[ pointer2 ] < list1[ pointer1 ]:
sortedList.append( list2[ pointer2 ] )
pointer2 += 1
elif list1[ pointer1 ] == list2[ pointer2 ]:
sortedList.append( list1[ pointer1 ] )
sortedList.append( list2[ pointer2 ] )
pointer1 += 1
pointer2 += 1
if pointer1 == 0:
for number in list1:
sortedList.append( number )
if pointer2 == 0:
for number in list2:
sortedList.append( number )
else:
amountNumbersLeft1 = len( list1 ) - ( pointer1 - 1 )
amountNumbersLeft2 = len( list2 ) - ( pointer2 - 1 )
if amountNumbersLeft1 != 0:
for o in range( 1, ( amountNumbersLeft1 ) ):
sortedList.append( list1[ o ] )
if amountNumbersLeft2 != 0:
for i in range( 1, ( amountNumbersLeft2 ) ):
sortedList.append( list2[ i ] )
return sortedList
我的测试用例([1,2,3],[4,5,6])作为参数起作用,返回一个列表[1,2,3,4,5,6]。然而,我的测试用例([2,13,19],[3,6,9,22])返回[2,3,6,9,13,19,6]。
我觉得有一个更简单的排序解决方案。请帮忙。感谢。
答案 0 :(得分:1)
代码实际上比你写的要简单得多。
def merge_lists(list1, list2):
sortedList = []
pointer1 = 0
pointer2 = 0
while pointer1 < len(list1) and pointer2 < len(list2):
if list1[pointer1] < list2[pointer2]:
sortedList.append(list1[pointer1])
pointer1 += 1
elif list1[pointer1] > list2[pointer2]:
sortedList.append(list2[pointer2])
pointer2 += 1
else:
sortedList.append(list1[pointer1])
pointer1 += 1
while pointer1 < len(list1):
sortedList.append(list1[pointer1])
pointer1 += 1
while pointer2 < len(list2):
sortedList.append(list2[pointer2])
pointer2 += 1
return sortedList
您的代码存在的问题是,pointer1
和pointer2
永远不会为0,因为您递增它们。因此,您始终执行pointer2 == 0
条件的else分支。 else语句中的逻辑是错误的,因为您正在索引1中再次添加数字,如for循环中所述。这就是为什么你再添加6而不是22,它是你示例中第二个列表的索引1处的值。
答案 1 :(得分:0)
这很简单。使用+合并列表,然后使用排序函数。
merged = sorted(list1 + list2)
答案 2 :(得分:0)
你的for循环迭代两个列表并继续附加较小的值并递增相应的索引是正确的。
def merge_lists( list1, list2 ):
sortedList = []
pointer1 = 0
pointer2 = 0
while pointer1 < len( list1 ) and pointer2 < len( list2 ):
if list1[ pointer1 ] < list2[ pointer2 ]:
sortedList.append( list1[ pointer1 ] )
pointer1 += 1
elif list2[ pointer2 ] < list1[ pointer1 ]:
sortedList.append( list2[ pointer2 ] )
pointer2 += 1
elif list1[ pointer1 ] == list2[ pointer2 ]:
sortedList.append( list1[ pointer1 ] )
sortedList.append( list2[ pointer2 ] )
pointer1 += 1
pointer2 += 1
直到现在,这一切都很好。之后发生错误。在这个时间点,至少有一个清单已经用尽。因此,您只需运行2 for 循环即可添加非耗尽列表中的剩余数字。
while pointer1 < len( list1 ):
sortedList.append( list1[ pointer1 ] )
pointer1 += 1
while pointer2 < len( list2 ):
sortedList.append( list2[ pointer2 ] )
pointer2 += 1
return sortedList
简单明了:)
答案 3 :(得分:0)
问题出在amountNumbersLeft1 = len( list1 ) - ( pointer1 - 1 )
行:在第二组测试数据中,len( list1 )
函数将返回4.而pointer1
将为3,因为它指向索引3. (4 - ( 3 - 1))
是2,这是您输出的索引。
我认为你真正想要的是for o in range( pointer1, len( list1 )-1 ):