public class Solution_104 {
/**
* @param lists: a list of ListNode
* @return: The head of one sorted list.
*/
class ListNodeComparator implements Comparator<ListNode>{
@Override
public int compare(ListNode l1,ListNode l2){
return l1.val-l2.val;
}
}
public ListNode mergeKLists(List<ListNode> lists){
if(lists==null || lists.size()==0){
return null;
}
Comparator<ListNode> comparator=new ListNodeComparator();
PriorityQueue<ListNode> heap=new PriorityQueue<ListNode>(lists.size(),comparator);
//get the first element of each list
for(int i=0;i<lists.size();i++){
if(lists.get(i)!=null){
heap.add(lists.get(i));
}
}
ListNode dummy=new ListNode(0);
ListNode temp=dummy;
while(!heap.isEmpty()){
ListNode currentMin=heap.poll();
temp.next=currentMin;
if(currentMin.next!=null){
heap.add(currentMin.next);
}
//equal to temp=temp.next;
temp=currentMin;
}
return dummy.next;
}
}
Version 2:
合并 k 个有序链表的逻辑类似合并两个有序链表,难点在于,如何快速得到 k 个节点中的最小节点,接到结果链表上?
这里我们就要用到 优先级队列(二叉堆) 这种数据结构,把链表节点放入一个最小堆,就可以每次获得 k 个节点中的最小节点:
ListNodemergeKLists(ListNode[] lists) {if (lists.length==0) returnnull;// 虚拟头结点ListNode dummy =newListNode(-1);ListNode p = dummy;// 优先级队列,最小堆PriorityQueue<ListNode> pq =newPriorityQueue<>(lists.length, (a, b)->(a.val-b.val));// 将 k 个链表的头结点加入最小堆for (ListNode head : lists) {if (head !=null)pq.add(head); }while (!pq.isEmpty()) {// 获取最小节点,接到结果链表中ListNode node =pq.poll();p.next= node;if (node.next!=null) {pq.add(node.next); }// p 指针不断前进 p =p.next; }returndummy.next;}