题目
https://leetcode-cn.com/problems/merge-k-sorted-lists/
方法一:优先队列合并
思路
优先队列存放每个链表的最小值,每轮取出头部的最小值,如果这条链表有后续节点就加入优先队列(每个链表都有序)。
代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
class Status{
int val;
ListNode ptr;
Status(int val, ListNode ptr) {
this.val = val;
this.ptr = ptr;
}
}
public ListNode mergeKLists(ListNode[] lists) {
if(lists.length==0)
return null;
if(lists.length==1)
return lists[0];
PriorityQueue<Status> queue=new PriorityQueue<Status>(lists.length,new Comparator<Status>(){
public int compare(Status t1,Status t2){
return t1.val-t2.val;
}
});
for(ListNode n:lists){
if(n!=null)
queue.add(new Status(n.val,n));
}
ListNode head=new ListNode(0);
ListNode tail=head;
while(!queue.isEmpty()){
Status tmp=queue.poll();
tail.next=tmp.ptr;//将节点加入新链表
tail=tail.next;//重新设置最后一个节点的位置
//如果这个链表后面还有节点,则加入队列
if(tmp.ptr.next!=null){
queue.add(new Status(tmp.ptr.next.val,tmp.ptr.next));
}
}
return head.next;
}
}
复杂度
结果
方法二:分治
代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
if(lists==null||lists.length==0)
return null;
if(lists.length==1)
return lists[0];
return merge(lists,0,lists.length-1);
}
public ListNode merge(ListNode[] lists,int left,int right){
if(left==right)
return lists[left];
int mid=left+(right-left)/2;
//或者int mid=(last+first)>>1;
ListNode l1=merge(lists,left,mid);//必须是mid
ListNode l2=merge(lists,mid+1,right);
return merge2(l1,l2);
}
public ListNode merge2(ListNode l1,ListNode l2){
if(l1==null)
return l2;
if(l2==null)
return l1;
//以下也可以使用一个个合并的方法
if(l1.val<l2.val){
l1.next=merge2(l1.next,l2);
return l1;
}
else{
l2.next=merge2(l1,l2.next);
return l2;
}
}
}