![](/img/trans.png)
[英]Merge two sorted Linked Lists in ascending order in Python: Issue with Singly Linked List pointer update
[英]How to define a recursive function to merge two sorted lists and return a new list with a increasing order in Python?
我想定義一個遞歸 function 來合並兩個排序列表(這兩個列表已排序)並返回一個新列表,其中包含兩個參數列表中的所有值,並按遞增順序排列。 我知道我可以使用 list.extend() 和 sorted() 來獲得它,但我不想使用它們。 我只想對遞歸做一些練習。
例如:
if a = [1,2,3,4], b = [5,6,7,8]
print(function(a,b))
[1,2,3,4,5,6,7,8]
這是我的代碼:
def combine(a:list, b:list):
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])
return combine(a[1:], b)
if a[0] > b[0]:
alist.append(b[0])
return combine(a, b[1:])
return alist
我總是得到 [5,6,7,8]。 我該怎么做才能得到 [1,2,3,4,5,6,7,8]?
除了返回以外,您應該將其添加到列表中,如下所示。
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
只是一個簡單的版本:
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
測試:
>>> combine([1,3,6,8], [2,4,5,7])
[1, 2, 3, 4, 5, 6, 7, 8]
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)
您的測試案例:
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]
另一個測試用例:
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]
以下是一些替代方案 :
這樣做的更聰明的方法是使用heapq模塊中的merge函數:
from heapq import merge
list(merge(a,b))
測試:
>>> a = [1,2,3,4,7,9]
>>> b = [5,6,7,8,12]
>>> [1, 2, 3, 4, 5, 6, 7, 7, 8, 9, 12]
並且不使用遞歸:
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
測試:
>>> a = [1,2,3,4,7,9]
>>> b = [5,6,7,8,12]
>>> [1, 2, 3, 4, 5, 6, 7, 7, 8, 9, 12]
靈感來自 Stefan Pochmann 的回答:
def combine(a, b):
if not a or not b:
return a or b
if a[0] >= b[0]:
return [b[0]] + combine(a, b[1:])
return [a[0]] + combine(a[1:], b)
例子:
print(combine([1, 2, 3], [4, 5, 6]))
# [1, 2, 2, 3, 5, 6]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.