23. 合并K个排序链表
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6
解1
利用K个指针指向链表的当前位置,每次循环找出最小值,复杂度O(KN)
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
ListNode ans = new ListNode(0);
ListNode cur = ans;
int len = lists.length;
while(true){
ListNode tmp = null;
int index = -1;
for(int i=0;i<len;i++){
if(lists[i]==null)
continue;
if(tmp==null||tmp.val>lists[i].val){
tmp=lists[i];
index=i;
}
}
if(index==-1)
break;
cur.next = tmp;
cur=cur.next;
lists[index]=lists[index].next;
}
return ans.next;
}
}
解2
利用小顶堆的思想,简化解1 中的复杂度 O(NlogK)
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
ListNode ans = new ListNode(0);
ListNode cur = ans;
Queue<ListNode> que = new PriorityQueue<>((o1,o2)->{
return o1.val-o2.val;
});
for(ListNode tr:lists){
if(tr!=null)
que.offer(tr);
}
while(!que.isEmpty()){
ListNode tmp= que.poll();
cur.next=tmp;
cur=cur.next;
if(tmp.next!=null){
que.offer(tmp.next);
}
}
return ans.next;
}
}