链接:https://leetcode-cn.com/problems/merge-k-sorted-lists/
给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。
示例 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
两两合并的思路其实和 LeetCode链表篇:21.合并两个有序链表 是一样的,所以可以参考这篇文章,这里就不再赘述。
时间复杂度:
空间复杂度:O(1)
class Solution:
def mergeKLists(self, lists: List[ListNode]) -> ListNode:
def mergeTwoLists(l1, l2):
head=dummy=ListNode(-1)
while l1 and l2:
if l1.val < l2.val:
head.next=l1
l1=l1.next
else:
head.next=l2
l2=l2.next
head=head.next
if l1:
head.next=l1
if l2:
head.next=l2
return dummy.next
ans=ListNode(float('-inf'))
for i in lists:
ans=mergeTwoLists(ans,i)
return ans.next
思路:
每次将链表列表分为两个部分,并分别合并两部分的链表,等到具体合并时,每次自底向上只合并两个链表。
时间复杂度:O(kn*logk)
空间复杂度:O(k)
class Solution:
def mergeKLists(self, lists: List[ListNode]) -> ListNode:
def mergeTwoLists(l1, l2):
head=dummy=ListNode(-1)
while l1 and l2:
if l1.val < l2.val:
head.next=l1
l1=l1.next
else:
head.next=l2
l2=l2.next
head=head.next
if l1:
head.next=l1
if l2:
head.next=l2
return dummy.next
def merge(lists,left,right):
if left==right:
return lists[left]
if left>right:
return
mid=left+(right-left)//2
return mergeTwoLists(merge(lists,left,mid),merge(lists,mid+1,right))
if not lists:
return
return merge(lists,0,len(lists)-1)
思路:
维护一个小顶堆,首先将所有链表的第一个节点加入小顶堆,每次从小顶堆中弹出一个节点加入到最终结果的链表里,并将节点的 next 加入到小顶堆中。
时间复杂度:O(n*logk),k 是原始链表的数量,n 是所有链表中的节点总数。堆操作是 O(logk),需操作 n 次。
空间复杂度:O(n+k),n 是节点总数,k 是堆大小。
import heapq
class Solution:
def mergeKLists(self, lists: List[ListNode]) -> ListNode:
p=dummy=ListNode(0)
head=[]
for i in range(len(lists)):
if lists[i]:
heapq.heappush(head,(lists[i].val,i))
lists[i]=lists[i].next
while head:
val,index=heapq.heappop(head)
p.next=ListNode(val)
p=p.next
if lists[index]:
heapq.heappush(head,(lists[index].val,index))
lists[index]=lists[index].next
return dummy.next
如果觉得文章不错,希望大家可以关注我噢,点赞、收藏、在看、分享就再好不过了。如果有任何建议和问题,可以在下方给我留言,我会不定期更新更多的文章,祝我们终将自由。