<刷题记录> 合并K个排序链表
LeetCode 第 23 题:合并 k 个排好序的链表,返回合并后的排序链表。分析和描述算法的复杂度。
示例
输入:
[
1 -> 4 -> 5,
1 -> 3 -> 4,
2 -> 6
]
输出:1 -> 1 -> 2 -> 3 -> 4 -> 4 -> 5 -> 6
解一:暴力法
用一个数组保存所有链表中的数,然后对这个数组进行排序,再从头到尾将数组遍历一遍,生成一个排好序的链表。
解二:分治法
当 k=1 的时候,直接返回结果;当 k=2 的时候,把这两个链表归并。当 k=3 的时候,我们可以把它们分成两组,分别归并完毕后再进行最后的归并操作,如下。
public ListNode mergeKLists(ListNode[] lists) {
if(lists.length == 0) return null;
if(lists.length == 1) return lists[0];
return mergeList(lists,0,lists.length-1);
}
public ListNode mergeList(ListNode[] lists,int low,int high){
if(low == high) return lists[low];
int mid = low + (high-low)/2;
//递归地处理左边和右边的链表,最后合并
ListNode a = mergeList(lists,low,mid);
ListNode b = mergeList(lists,mid+1,high);
return mergeTwo(a,b);
}
//合并两个链表
public ListNode mergeTwo(ListNode a, ListNode b){
if(a == null) return b;
if(b == null) return a;
ListNode head = new ListNode(0);
ListNode temp = head;
while(true){
if(a.val < b.val){
temp.next = a;
temp = temp.next;
a = a.next;
}else{
temp.next = b;
temp = temp.next;
b = b.next;
}
if(a == null){
temp.next = b;
break;
}
if(b == null){
temp.next = a;
break;
}
}
return head.next;
}

浙公网安备 33010602011771号