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

Python 如何在给定两个已排序列表的情况下创建已排序列表(无法修改任一给定列表),python,list,python-2.7,function,sorting,Python,List,Python 2.7,Function,Sorting,我的目标是创建一个函数,该函数将2个排序整数列表作为参数 并创建一个已排序的合并列表。唯一的问题是不允许我这么做 修改2个原始列表(并且不能复制以修改其中一个)。仅允许的内置项为range()、len()、index()、append()。到目前为止,我被难住了 以下是我所拥有的: def merge_lists( list1, list2 ): sortedList = [] pointer1 = 0 pointer2 = 0 while pointer1 < len( list

我的目标是创建一个函数,该函数将2个排序整数列表作为参数 并创建一个已排序的合并列表。唯一的问题是不允许我这么做 修改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
def merge_列表(列表1、列表2):
sortedList=[]
指针1=0
指针2=0
当指针1
我的测试用例使用([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]


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

这很简单。使用+合并列表,然后使用排序函数

merged = sorted(list1 + list2)

代码实际上比您编写的要简单得多

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
def merge_列表(列表1、列表2):
sortedList=[]
指针1=0
指针2=0
当指针1list2[pointer2]:
sortedList.append(列表2[pointer2])
指针2+=1
其他:
sortedList.append(列表1[pointer1])
指针1+=1
而指针1

您的代码的问题是,自从您将它们递增后,
pointer1
pointer2
将永远不会为0。因此,您总是执行
指针2==0
条件的else分支。else语句中的逻辑是错误的,因为您正在按照for循环中的说明从索引1再次添加数字。这就是为什么要再次添加6而不是22,它是示例中第二个列表的索引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 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
def merge_列表(列表1、列表2):
sortedList=[]
指针1=0
指针2=0
当指针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
而指针1

简单明了:)

问题在于您的
amountNumbersLeft1=len(列表1)-(指针1-1)
行:在第二组测试数据中,
len(列表1)
函数将返回4。而
指针1
将是3,因为它指向索引3<代码>(4-(3-1))
是2,这是您输出的索引


我认为你真正想要的是
范围内的o(pointer1,len(list1)-1):

请不要发布代码屏幕截图的链接,而是将其包含在你的帖子中。最好以文本形式提供代码(可以在帖子中格式化为代码),这样我们就可以进行更改和测试。这里没有人对手动将代码输入文件感兴趣!?好的,我会的!如果您直接在输入列表项上迭代,而不是通过索引间接进行迭代,则此代码会简单得多。很抱歉,我忘了提到内置的排序函数是不允许的*fixedI为第二个测试用例运行此代码,并返回[2,3,6,9,13,19]。我仍然缺少清单中的最后一个元素,22。知道为什么吗?@bariox我在第二个while循环中有一个输入错误。它应该是
len(list2)
而不是
len(list1)
,现在答案中的代码已经修复。啊,谢谢你,我接受了你的答案。谢谢所有回复我的人,他们帮了我很多忙。