如何在给定两个已排序的列表的情况下创建排序列表(无法修改给定列表)

时间:2016-05-25 19:42:05

标签: python list python-2.7 function sorting

我的目标是创建一个函数,它将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]。

我觉得有一个更简单的排序解决方案。请帮忙。感谢。

4 个答案:

答案 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

您的代码存在的问题是,pointer1pointer2永远不会为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 ):