面试必考真题-算法篇 牛客网
堆 链表 分治
题目描述
合并 k 个已排序的链表并将其作为一个已排序的链表返回。分析并描述其复杂度。
题目分析
利用优先队列实现,因为要将链表按照从小到大的顺序合并,所以优先队列实现按照最小元素优先出队原则修改比较器。之后操作按照首先将链表数组的每个链表的头结点加入队列(由于链表是有序的且是从小到大排序,所以只需要将每个链表的头节点入队即可。)。之后再出队,出队之后,将出队的节点的下一个节点加入优先队列,如此反复直至队列中为空。
下面是Java代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
import java.util.ArrayList;
import java.util.PriorityQueue;
import java.util.Comparator;
public class Solution {
public ListNode mergeKLists(ArrayList<ListNode> lists) {
if(lists == null || lists.size() == 0){
return null;
}
PriorityQueue<ListNode> queue = new PriorityQueue<ListNode>(lists.size(),new Comparator<ListNode>(){
public int compare(ListNode o1, ListNode o2){
if(o1.val < o2.val){
return -1;
}else if(o1.val == o2.val){
return 0;
}else{
return 1;
}
}
});
ListNode dummy = new ListNode(0);
ListNode tail = dummy;
for(ListNode node : lists){
if(node!=null){
queue.add(node);
}
}
while(!queue.isEmpty()){
tail.next = queue.poll();
tail = tail.next;
if(tail.next !=null){
queue.add(tail.next);
}
}
return dummy.next;
}
}