力扣23:合并k个排序链表
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6
思路
这让我想起了上次腾讯的题,n个数组的topK问题。这个也可以用一个优先队列维护一个最小值,每次都在队列中弹出最小值加入链表,再将这个节点的next加入到优先队列。
思路很简单,这边代码方面可以着重看一下java的优先队列PriorityQueue的使用
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
if(lists == null) return null;
if(lists.length == 0) return null;
ListNode ans = new ListNode(0);
ListNode p = ans;
int len = lists.length;
PriorityQueue<ListNode> minQueue = new PriorityQueue<>(new Comparator<ListNode>() {
@Override
public int compare(ListNode o1, ListNode o2) {
return o1.val - o2.val;
}
});
for(int i=0;i<len;i++) {
if(lists[i] != null) minQueue.add(lists[i]);
}
while(!minQueue.isEmpty()) {
ListNode node = minQueue.poll();
if(node.next != null) minQueue.add(node.next);
p.next = node;
p = p.next;
}
return ans.next;
}
}