合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6
拿到第一个思路就是全部放到数组然后排序生成新链表,但是想到这是一个困难级别的题应该不会使用这种愚蠢的办法做出来,所以在冥思苦想之后看了下题解,恍然大悟-------优先队列:普通队列每次出队只能弹出队首元素,但是优先队列会根据优先级来弹出元素(每次新添加后会维护队首元素,且结构不为线性,而为堆,所以维护速度会快许多(当初打比赛的时候要是知道就好了。。。))所以每次维护堆顶的最小值,就能够得出结果。(最开始想手写结构,发现自己太菜,且函数库真的很方便)。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
ListNode a = new ListNode(0);
ListNode b = a;
Comparator<ListNode> cmp = new Comparator<ListNode>(){ //设置比较器
public int compare(ListNode a,ListNode b){
return a.val - b.val;
}
};
Queue<ListNode> mp = new PriorityQueue<ListNode>(cmp); //设置优先队列
for(int i = 0 ;i < lists.length;i++){
if(lists[i]!=null)
mp.add(lists[i]);
}
while(!mp.isEmpty()){
b.next = mp.peek();
b = b.next;
if(mp.peek().next != null){
ListNode k = mp.peek().next;
mp.poll(); //队列用的pop
mp.add(k);//队列用的push
}
else{
mp.poll();
}
}
return a.next;
}
}
嗯 收获颇丰,下来打算仔细看看优先队列的源码。
-----加油