队列——优先队列
1、合并k个有序链表(23)
题目描述:
【困难题】
给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。
题目链接
思路分析:
题解一:暴力法
先把所有的值放在一个数组里,然后对数组排序。
# 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[ListNode]) -> ListNode:
nums=[]
for i in range(len(lists)):
while lists[i]:
nums.append(lists[i].val)
lists[i]=lists[i].next
nums.sort()
dummy=ListNode(1)# 哑结点
p=dummy
for num in nums:
p.next=ListNode(num)
p=p.next
return dummy.next
- 时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn)
- 空间复杂度: O ( n ) O(n) O(n)
题解二:两两合并
逐个调用Leetcode-21 合并两个有序链表里的合并两个链表的函数。
# 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[ListNode]) -> ListNode:
while len(lists)>1:
a=lists.pop() if len(lists) > 0 else None
b=lists.pop() if len(lists) > 0 else None
lists.insert(0,self.mergeTwolists(a,b))
return None if len(lists)<1 else lists[0]
def mergeTwolists(self, l1,l2):
prehead=ListNode(0) # 建立虚拟节点
prev=prehead
while l1 and l2:
if l1.val<l2.val:
prev.next=l1
l1=l1.next
else:
prev.next=l2
l2=l2.next
prev=prev.next
prev.next=l1 if l1 is not None else l2
return prehead.next
题解三:优先队列
利用一个长度为K的优先级队列
每次把K个链表的当前头的val塞进优先级队列,取pop出来的值作为结果链表的val.
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
from heapq import *
class Solution:
def mergeKLists(self, lists: List[ListNode]) -> ListNode:
pq=[]
for i in range(len(lists)):
if lists[i]:
heappush(pq,(lists[i].val,i))
lists[i]=lists[i].next
dummy=ListNode(1)
p=dummy
while pq:
val,idx=heappop(pq)
p.next=ListNode(val)
p=p.next
if lists[idx]:
heappush(pq,(lists[idx].val,idx))
lists[idx]=lists[idx].next
return dummy.next
2、前k个高频元素(347)
题目描述:
【中等题】
给定一个非空的整数数组,返回其中出现频率前 k 高的元素。
题目链接
思路分析: