题目
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-k-sorted-lists
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
很简单,因为是小的先插入,使用优先队列实现。把k个链表当前第一个元素的集合视为查找范围,优先插入到链表
中,如果每次新对该集合加入一个元素,那么有需要重新把k个元素遍历一次,找出最小值。看到这里就想到了优先
队列节约时间。
暴力搜索的时间复杂度是O(N *K) ,优化后的时间复杂度为O(N*log K)
代码
class Solution {
public static class compareNode implements Comparable<compareNode> {
int value;
ListNode to;
public compareNode(ListNode node) {
this.value = node.val;
this.to = node;
}
@Override
public int compareTo(compareNode o) {
return this.value - o.value;
}
}
public ListNode mergeKLists(ListNode[] lists) {
// 每一个都是有序的
int count = 0;
ListNode head = new ListNode(-1);
PriorityQueue<compareNode> pq = new PriorityQueue<compareNode>();
for (int i = 0; i < lists.length; i++) {
if(lists[i]!=null){
pq.offer(new compareNode(lists[i]));}
}
ListNode last = head;
while (!pq.isEmpty()) {
compareNode tmp=pq.poll();
ListNode minNode = tmp.to;
last.next = minNode;
if (minNode.next != null)
pq.offer(new compareNode(minNode.next));
last=last.next;
}
return head.next;
}
}