【问题标题】:How to create a sorted list given two already sorted lists ( cannot modify either given lists )如何在给定两个已排序列表的情况下创建排序列表(不能修改任一给定列表)
【发布时间】:2016-05-25 19:42:04
【问题描述】:

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

我以 ( [ 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 ]。

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

【问题讨论】:

  • 请不要发布代码屏幕截图的链接,而是将其包含在您的帖子中。
  • 最好将代码提供为文本(可以在帖子中格式化为代码),以便我们进行更改和测试。这里没有人对手动将代码输入文件感兴趣!
  • 好的,我会这样做的!
  • 如果您直接遍历输入列表项而不是使用索引间接执行此代码,则此代码会简单得多。

标签: python list python-2.7 function sorting


【解决方案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 处的值。

【讨论】:

  • 我为第二个测试用例运行了这段代码,它返回 [2, 3, 6, 9, 13, 19]。我仍然缺少列表中的最后一个元素,即 22。任何想法为什么?
  • @bariox 我在第二个 while 循环中有错字。它应该是 len(list2) 而不是 len(list1),代码现在已在答案中修复。
  • 谢谢,我接受了你的回答。感谢所有回复的人对我的帮助很大。
【解决方案2】:

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

merged = sorted(list1 + list2)

【讨论】:

  • 对不起,我忘了提到内置的排序功能是不允许的。 *固定
【解决方案3】:

您的 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

简单明了:)

【讨论】:

    【解决方案4】:

    问题出在您的 amountNumbersLeft1 = len( list1 ) - ( pointer1 - 1 ) 行中:在您的第二组测试数据中,len( list1 ) 函数将返回 4。而 pointer1 将是 3,因为它指向索引 3。(4 - ( 3 - 1)) 是 2 ,也就是你输出的索引。

    我想你真正想要的是for o in range( pointer1, len( list1 )-1 ):

    【讨论】:

      猜你喜欢
      • 2012-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-05
      • 2014-10-12
      • 2015-07-25
      • 2020-08-20
      • 1970-01-01
      相关资源
      最近更新 更多