题目
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6
大体思路
使用分治的思想。
首先看两个链表的合并,
我们每次选择较小的头元素,直到选完为止。
下一步:
以下省略…
两个链表合并的代码
public ListNode mergeTwoLists(ListNode l1,ListNode l2){
if(l1==null) return l2;
if(l2==null) return l1;
if(l1.val<l2.val){
l1.next=mergeTwoLists(l1.next, l2);
return l1;
}else{
l2.next=mergeTwoLists(l1, l2.next);
return l2;
}
}
K项合并
k路归并,相信学过数据结构的人都很好理解归并思想。
归并采用递归的思想,先把所有元素分为单个元素,然后逐次合并,向上返回,最总合并为一个总的链表。分治不外乎就是分和治两个过程,而治其实就是merge的过程。
分治代码(包括了上面的代码)
public class problem23 {
//Definition for singly-linked list.
public static class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
}
public ListNode mergeKLists(ListNode[] lists) {
if(lists==null||lists.length==0) return null;//为空时的特判
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;
ListNode l1=merge(lists,left,mid);
ListNode l2=merge(lists,mid+1,right);
return mergeTwoLists(l1,l2);
}
public ListNode mergeTwoLists(ListNode l1,ListNode l2){
if(l1==null) return l2;
if(l2==null) return l1;
if(l1.val<l2.val){
l1.next=mergeTwoLists(l1.next, l2);
return l1;
}else{
l2.next=mergeTwoLists(l1, l2.next);
return l2;
}
}
}