合并 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.