23. 合并 K 个升序链表 #
链接 #
题目 #
给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。
示例 1:
输入:lists = [[1,4,5],[1,3,4],[2,6]] 输出:[1,1,2,3,4,4,5,6] 解释:链表数组如下: [ 1->4->5, 1->3->4, 2->6 ] 将它们合并到一个有序链表中得到。 1->1->2->3->4->4->5->6
示例 2:
输入:lists = [] 输出:[]
示例 3:
输入:lists = [[]] 输出:[]
提示:
k == lists.length
0 <= k <= 10^4
0 <= lists[i].length <= 500
-10^4 <= lists[i][j] <= 10^4
lists[i]
按 升序 排列lists[i].length
的总和不超过10^4
解答 #
# 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 not lists:
return None
n = len(lists)
if n == 1:
return lists[0]
if n == 2:
return self.mergeTwoLists(lists[0], lists[1])
h = n >> 1
l1 = self.mergeKLists(lists[: h])
l2 = self.mergeKLists(lists[h:])
return self.mergeTwoLists(l1, l2)
def mergeTwoLists(self, l1: Optional[ListNode], l2: Optional[ListNode]):
d = ListNode()
c = d
while l1 and l2:
if l1.val < l2.val:
c.next = l1
l1 = l1.next
else:
c.next = l2
l2 = l2.next
c = c.next
c.next = l1 if l1 else l2
return d.next