Merge k Sorted Lists
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
Solution1
- 将链表利用二分法两两进行合并。代码如下:
public class Solution {
public ListNode mergeKLists(ListNode[] lists) {
if(lists.length==0) return null;
return help1(lists,0,lists.length-1);
}
public ListNode help1(ListNode[] lists, int start, int end){//用二分法比用for循环还是简单快速一些
if(start>=end) return lists[start];
int mid = (start+end)/2;
ListNode l1 = help1(lists,start,mid);
ListNode l2 = help1(lists,mid+1,end);
return merge(l1,l2);
}
public ListNode merge(ListNode l1, ListNode l2){//将两个链表进行合并
ListNode dummy = new ListNode(-1);
dummy.next = l1;
l1 = dummy;
while(l1.next!=null&&l2!=null){
if(l1.next.val>l2.val){
ListNode temp = l1.next;
l1.next = l2;
l2 = l2.next;
l1.next.next = temp;
}
l1 = l1.next;//不管是l1大还是l2大,l1最终都要往下走一步。
}
if(l2!=null) l1.next = l2;
return dummy.next;
}
}
Solution2
- 利用最小堆来实现。即先将链表的所有头结点放入一个最小堆,每次从最小堆取出一个最小值的节点来,并将该节点后面的节点存入最小堆。如此往复。代码如下:
import java.util.Comparator;
import java.util.PriorityQueue;
public class Solution {
public ListNode mergeKLists(ListNode[] lists) {
PriorityQueue<ListNode> pq = new PriorityQueue<ListNode>(1,new Comparator<ListNode>(){
public int compare(ListNode l1,ListNode l2){
return l1.val-l2.val;
}
});//利用优先队列实现了一个最小堆
for(ListNode node:lists) if(node!=null) pq.offer(node);//将所有头结点存入最小堆中
ListNode head = pq.poll();//先取出头结点,当然这里也可以用虚节点从而更方便
ListNode node = head;
while(node!=null){
ListNode temp = node.next;
if(temp!=null) pq.offer(temp);
node.next = pq.poll();
node = node.next;
if(pq.size()==0) break;
}
return head;
}
}