题目
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-k-sorted-lists
python3
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def mergeKLists(self, lists: List[ListNode]) -> ListNode:
#暴力法 列表存入所有val ,升序排序,列表转为ListNode形成新链表
"""
res=[]
for i in range(len(lists)):
while lists[i]!=None:
res.append(lists[i].val)
lists[i]=lists[i].next #K*N o(N)
res.sort() # o(NlogN)
head=point=ListNode(0)
for i in res:
point.next=ListNode(i)
point=point.next #o(N)
return head.next
"""
#优先队列 优化暴力
#将所有的val存入优先队列依次取出即可
import heapq
head=point=ListNode(0)
res=[]
for i in range(len(lists)):
while lists[i] :
heapq.heappush(res, (lists[i].val, i))
lists[i] = lists[i].next
while res:
#print(res)
val, p = heapq.heappop(res)
point.next = ListNode(val)
point = point.next
return head.next
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def mergeKLists(self, lists: List[ListNode]) -> ListNode:
#优先队列 +贪心
#取出K个排序链表的第一个 存入优先队列,
#再取出排序链表的第二个 存入优先队列,依次进行
import heapq
head=point=ListNode(0)
res=[]
for i in range(len(lists)):
if lists[i] :
heapq.heappush(res, (lists[i].val, i))
lists[i] = lists[i].next
while res:
val, p = heapq.heappop(res)
point.next = ListNode(val)
point = point.next
if lists[p]:
heapq.heappush(res, (lists[p].val, p))
lists[p] = lists[p].next
return head.next