Java PriorityQueue类是一种队列数据结构实现,其中根据优先级处理对象。它与遵循FIFO(先进先出)算法的标准队列不同。
在优先级队列中,添加的对象根据其优先级。默认情况下,优先级由对象的自然顺序决定。队列构建时提供的比较器可以覆盖默认优先级。
因为java中的优先队列默认是小根堆,要实现大根堆可以用以下两种方法:
-
使用自定义比较器
如何用 PriorityQueue 实现大根堆 queueA?
这里的知识点包括:
-
PriorityQueue 默认是小根堆,大根堆需要重写比较器。
-
可以在 new PriorityQueue<>() 中的参数部分加入比较器。
-
具体写法是:(v1, v2) -> v2 - v1。
-
Queue 类的输入是 offer() 方法,弹出是 poll() 方法。
-
描述
给定一个节点数为n的无序单链表,对其按升序排序。
数据范围:0<n≤100000,保证节点权值在[−109,109]之内。
要求:空间复杂度 O(n),时间复杂度 O(nlogn)
import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* }
*/
public class Solution {
/**
*
* @param head ListNode类 the head node
* @return ListNode类
*/
public ListNode sortInList (ListNode head) {
// write code here
PriorityQueue<ListNode> heap = new PriorityQueue<>((n1, n2) -> n1.val - n2.val);
while (head != null) {
heap.add(head);
head = head.next;
}
ListNode dummy = new ListNode(-1);
ListNode cur = dummy;
while (!heap.isEmpty()) {
cur.next = heap.poll();
cur = cur.next;
}
cur.next = null;
return dummy.next;
}
}