合并 K 个排序链表
leetcode 38
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6
分治法
使用和归并排序一样的分治算法。
每两个链表进行合并,逐层返回。既使用了分治法,也使用了递归。
# 分治法
def mergeKLists(self, lists: List[ListNode]) -> ListNode:
return self.merge(lists, 0, len(lists) - 1)
def merge(self, lists, left, right):
if left == right:
return lists[left]
if left < right:
mid = left + right >> 1
return self.mergeTwoList(self.merge(lists, left, mid), self.merge(lists, mid+1, right))
def mergeTwoList(self, l1, l2):
if not l1:
return l2
if not l2:
return l1
if l1.val < l2.val:
l1.next = self.mergeTwoList(l1.next, l2)
return l1
l2.next = self