How to define a recursive function to merge two sorted lists and return a new list with a increasing order in Python?

后端 未结 4 633
予麋鹿
予麋鹿 2021-01-27 00:32

I want to define a recursive function to merge two sorted lists (these two lists are sorted) and return a new list containing all the values in both argument lists with a incre

相关标签:
4条回答
  • 2021-01-27 00:40

    Just a simpler version:

    def combine(a, b):
        if a and b:
            if a[0] > b[0]:
                a, b = b, a
            return [a[0]] + combine(a[1:], b)
        return a + b
    

    Test:

    >>> combine([1,3,6,8], [2,4,5,7])
    [1, 2, 3, 4, 5, 6, 7, 8]
    
    0 讨论(0)
  • 2021-01-27 00:43

    Here are some alternatives:

    The smarter way to do this is to use merge function from the heapq module:

    from heapq import merge
    list(merge(a,b))
    

    Test:

    >>> a = [1,2,3,4,7,9]
    >>> b = [5,6,7,8,12]
    >>> [1, 2, 3, 4, 5, 6, 7, 7, 8, 9, 12]
    

    And without using recursion:

    def combine(a:list, b:list):    
        alist = []
        i,j = 0,0
        while i < len(a) and j < len(b):
            if a[i] < b[j]:
                alist.append(a[i])
                i+=1
            else:
                alist.append(b[j])
                j+=1
    
        while i < len(a):
            alist.append(a[i])
            i+=1
    
        while j < len(b):
            alist.append(b[j])
            j+=1
    
        return alist
    

    Test:

    >>> a = [1,2,3,4,7,9]
    >>> b = [5,6,7,8,12]
    >>> [1, 2, 3, 4, 5, 6, 7, 7, 8, 9, 12]
    
    0 讨论(0)
  • 2021-01-27 01:02

    Instead of return, you should add it to the alist as like below.

    def combine(a, b):
        alist = []
        if a == [] and b == []:
           return alist
        if a != [] and b == []:
           return alist + a
        if a == [] and b != []:
           return alist + b
        if a != [] and b != []:
           if a[0] <= b[0]:
              alist.append(a[0])
              alist = alist +  combine(a[1:], b)
           if a[0] > b[0]:
              alist.append(b[0])
              alist = alist +  combine(a, b[1:])
        return alist
    
    0 讨论(0)
  • 2021-01-27 01:03
    def combine(a,b):
        if not a and not b: return []
        if not a: return [b[0]] + combine(a, b[1:])
        if not b: return [a[0]] + combine(a[1:], b)
        if a[0] > b[0]:
            return [b[0]] + combine(a, b[1:])
        return [a[0]] + combine(a[1:], b)
    

    Your test case:

    In [2]: a = [1,2,3,4]
    
    In [3]: b = [5,6,7,8]
    
    In [4]: combine(a,b)
    Out[4]: [1, 2, 3, 4, 5, 6, 7, 8]
    

    Another test case:

    In [24]: a
    Out[24]: [1, 2, 3, 8, 9]
    
    In [25]: b
    Out[25]: [1, 3, 5, 6, 7]
    
    In [26]: combine(a,b)
    Out[26]: [1, 1, 2, 3, 3, 5, 6, 7, 8, 9]
    
    0 讨论(0)
提交回复
热议问题