问题:力扣23
【解题思路】:
使用java中的优先队列来解决这个问题,将数组中每个链表的头节点如下图所示,优先队列会自动排序,然后出队一个元素放入新地队列中,刚才出队的队列后移一位进入优先队列重新排序,重复这个过程,直到优先队列未空,所有元素都加入了新的队列中,合并结束!
代码如下:
/**
* 合并多个排好序的链表
* 采用优先队列的方法
*/
class hb_LB {
public ListNode mergeKLists(ListNode [] lists) {
if (lists.length == 0) {
return null;
}
int len = lists.length;
ListNode p = new ListNode(-1);
ListNode dump = p;
//定义优先队列
Queue<ListNode> pq = new PriorityQueue<>(len,(a,b)->(a.val-b.val));
//将数组中每个队列的头节点都装入优先队列
for(int i=0;i<len;i++){
ListNode head = lists[i];
pq.add(head);
}
//判断条件是队列不为空,当队列中所有元素出队之后也就都放到新的队列中了
while (!pq.isEmpty()){
//先出队最小的数
ListNode cur = pq.poll();
//放到新的队列中
p.next = cur;
//装入新的元素
if(cur.next!=null){
pq.add(cur.next);
}
//信队列后移
p = p.next;
}
return dump.next;
}
public static void main(String [] args){
ListNode[] lists = new ListNode[3];
ListNode head1 = new ListNode(1);
head1.addone(5);head1.addone(7);
ListNode head2 = new ListNode(1);
head2.addone(4);head2.addone(6);
ListNode head3 = new ListNode(2);
head3.addone(3);head3.addone(9);
head1.printListnode();
head2.printListnode();
head3.printListnode();
lists[0] = head1;
lists[1] = head2;
lists[2] = head3;
hb_LB h = new hb_LB();
ListNode newhead = h.mergeKLists(lists);
newhead.printListnode();
}
}
顺便延伸一下优先队列的基本用法:
PriorityQueue这个类是Queue接口的直接子类,这个类叫做优先队列,首先队列本身这个数据结构大家应该都知道,在队列本身这个基础上又有了双端队列,优先队列,延迟队列等变形的数据结构,这类数据结构都为实际问题的解决中提供了更加便捷的方法,此类是一个线程非安全的类,线程安全的类是PriorityBlockingQueue。优先队列的用法在上面图中大家应该可以很好的理解了,下面我们介绍一些优先队列的方法构成。
1、构造函数
我们最常用的构造方法是指定优先队列的大小并配置比较器。
2、其他方法