题目要求:
首先链表class已经定义好了,参数给的是每个链表的头节点,所以使用java自带的优先级队列来替换暴力的装入集合后排序
大致实现思路为:把N个链表的头节点都装入优先级队列,优先级队列会按实现的比较器把最小的元素放在最上面,然后取出一个元素把它加入新链表并把它在原链表里的元素加入优先级队列
代码:
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
if(lists == null){
return null;
}
/** * 使用java的优先级队列把每个数组的头节点装入 */
PriorityQueue<ListNode> heap = new PriorityQueue<>(new ListNodeComparator());
for(int i=0;i<lists.length;i++){
if(lists[i]!=null){
heap.add(lists[i]);
}
}
if(heap.isEmpty()){
return null;
}
ListNode head = heap.poll();//取出最小的作为头节点返回
ListNode last = head;
if(last.next!=null){
heap.add(last.next);
}
while(!heap.isEmpty()){
ListNode cur = heap.poll();//不停的取出优先级队列中最小的节点,
last.next = cur;//把被取出的节点加在最后一个元素后面
last = cur;//刚刚被加上去的节点成为最后一个元素
if(cur.next!=null){
//判断刚刚操作的元素在原链表之后还有节点吗,有就加入优先级队列,顶替它空掉的位置
heap.add(cur.next);
}
}
return head;
}
/** * 实现一个比较器给优先级队列比大小 */
public static class ListNodeComparator implements Comparator<ListNode>{
@Override
public int compare(ListNode o1, ListNode o2) {
return o1.val - o2.val; //升序
}
}
}
结果:算法复杂度为O(nlogn)