合并K个排序链表

162 阅读1分钟

合并 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) {
        if( lists.length == 0 ){
            return null;
        }
         PriorityQueue< ListNode > min = new PriorityQueue<>(lists.length ,new Comparator<ListNode>(){
           @Override
           public int compare( ListNode o1 , ListNode o2 ){
               return o1.val - o2.val;
           }
       });
       for( ListNode list : lists ){
           if( list != null )
           min.offer( list );
       }
       ListNode dummy =  new ListNode(-1);
       ListNode cur = dummy; 
       while( min.size() != 0 ){
           ListNode node = min.poll();
           cur.next = node;
           cur = node;
           if( node.next != null )
           min.offer( node.next );
       } 
       return dummy.next; 
    }
}

解题思路: 用大小为数组长度的最小堆来处理, 先把所有链表放进堆中 ,然后每次弹出堆顶元素 , 如果弹出元素还有下一个结点 , 则继续放进堆中。 时间复杂度: 假设链表平均长度为n , 数组个数为k , 则需要取n*k个元素, 更新堆需要logk, 则总时间为nklogk.