我一直在研究 Leetcode #23: Merge K Sorted Lists (https://leetcode.com/problems/merge-k-sorted-lists/description/) 并遇到了一个问题。
我知道一个可行的解决方案是使用分而治之的方法,所以我尝试使用递归来实现它(就像我想象的合并排序的工作方式一样),但我不断遇到最大递归深度并且无法弄清楚为什么。我也尝试单步执行调试器,直到最后一步似乎一切都正常。
这是我的代码:
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def mergeKLists(self, lists: List[Optional[ListNode]]) -> Optional[ListNode]:
if len(lists) == 1:
return lists[0]
elif len(lists) == 2:
return self.merge2Lists(lists[0], lists[1])
v1 = self.mergeKLists(lists[:len(lists)//2])
v2 = self.mergeKLists(lists[len(lists)//2:])
return self.merge2Lists(v1, v2)
def merge2Lists(self, list1, list2):
result = ListNode()
cur = result
while list1 and list2:
if list1.val < list2.val:
cur.next = ListNode(list1.val)
list1 = list1.next
else:
cur.next = ListNode(list2.val)
list2 = list2.next
cur = cur.next
while list1:
cur.next = ListNode(list1.val)
list1 = list1.next
cur = cur.next
while list2:
cur.next = ListNode(list2.val)
list2 = list2.next
cur = cur.next
return result.next
非常感谢对此的任何帮助,因为我已经为此奋斗了几个小时。 (顺便说一句,我知道这种分而治之的方法有迭代解决方案,但我想尝试让这种递归方法发挥作用)。
我们应该通过检查
if not lists
: 在 mergeKLists()
函数的开头并返回 None
来处理列表为空的情况。
我们还应该确保在主合并循环之后使用
merge2Lists()
将剩余元素附加到 cur.next = list1 if list1 else list2
中。
class Solution:
def mergeKLists(self, lists: List[Optional[ListNode]]) -> Optional[ListNode]:
lists = [lst for lst in lists if lst]
if not lists:
return
if len(lists) == 1:
return lists[0]
if len(lists) == 2:
return self.merge2Lists(lists[0], lists[1])
v1 = self.mergeKLists(lists[:len(lists) // 2])
v2 = self.mergeKLists(lists[len(lists) // 2:])
return self.merge2Lists(v1, v2)
def merge2Lists(self, list1, list2):
result = ListNode()
cur = result
while list1 and list2:
if list1.val < list2.val:
cur.next = list1
list1 = list1.next
else:
cur.next = list2
list2 = list2.next
cur = cur.next
cur.next = list1 if list1 else list2
return result.next