LeetCode刷题:合并K个排序链表(day48)
题目描述:
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6
思路:大根堆中的个数保持为<= k, 每次插入一个新的元素都会进行时效为logk的堆排序
插入次数为所有链表节点个数;所以时间复杂度为nlogk
代码奉上
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
大根堆中的个数保持为<= k, 每次插入一个新的元素都会进行时效为logk的堆排序
* 插入次数为所有链表节点个数;所以时间复杂度为nlogk
*/
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
if(lists == null)
return null;
PriorityQueue<ListNode> heap = new PriorityQueue<>(new Comparator<ListNode>(){
public int compare(ListNode n1, ListNode n2){
return n1.val - n2.val;
}
});
for(ListNode head : lists){
if(head != null)
heap.add(head);
}
ListNode head = new ListNode(0);
ListNode cur = head;
while(!heap.isEmpty()){
cur.next = heap.poll();
cur = cur.next;
if(cur.next != null)
heap.add(cur.next);
}
return head.next;
}
}
执行结果:
执行耗时: