题目:
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6
来源:力扣(LeetCode)
法一:排序
法二:与归并排序的merge过程相似,依次选取每一个链表的最小值中的最小值直至链表为空。
法三:优先队列法。
思路源于法二,只不过一个好的数据结构能让我们做起事情来达到事半功倍的效果。
用到了PriorityQueue
public ListNode mergeKLists(ListNode[] lists) {
if(lists==null||lists.length==0) {return null;}
PriorityQueue<ListNode> q = new PriorityQueue<>(lists.length, new Comparator<ListNode>() {
public int compare(ListNode c1,ListNode c2) {
if(c1.val == c2.val)return 0;
return c1.val>c2.val?1:-1;
}
});
ListNode l1 = new ListNode(0);
ListNode p = l1;
for(ListNode x:lists) {
if(x!=null)
q.add(x);
}
while(!q.isEmpty()) {
p.next = q.poll();
p = p.next;
if(p.next!=null) {
q.add(p.next);
}
}
return l1.next;
}