力扣:[23. 合并K个升序链表]
合并K个升序链表我们怎么办呢?
我们知道,合并两个生锈链表的步骤是这样的:
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
ListNode res = new ListNode(-1);
ListNode pre = res;
while(list1 != null && list2 != null){
if(list1.val <= list2.val){
pre.next = list1;
list1 = list1.next;
}else{
pre.next = list2;
list2 = list2.next;
}
pre = pre.next;
}
if(list1 == null){
pre.next = list2;
}
if(list2 == null){
pre.next = list1;
}
return res.next;
}
那合并K个呢?我们这样想,既然是合并k个,那我们两个两个合并不就可以了吗!是的,这道题目的解法就是这样,像这样,我们把一个大的问题,分割成很多个子问题的思想,就是分治,那现在我们知道怎么写了,首先,他的合并方法肯定是上面的方法,关键在于怎么分割成两个两个的呢?
我们将题目所给的数组拆分,拆分成两个数组,不断的递归,让数组两个两个合并,再返回。我们看主签名函数:
public ListNode mergeKLists(ListNode[] lists) {
if(lists.length == 0) return null;
if(lists.length == 1) return lists[0];
if(lists.length == 2) return mergeSort(lists[0],lists[1]);
int mid = lists.length/2;
ListNode[] arr1 = new ListNode[mid];
for(int i = 0;i<mid;i++){
arr1[i] = lists[i];
}
ListNode[] arr2 = new ListNode[lists.length - mid];
for(int i = mid;i<lists.length;i++){
arr2[i-mid] = lists[i];
}
return mergeSort(mergeKLists(arr1),mergeKLists(arr2));
}
这样是不是就可以分成两个两个的呢?当然如果使用for循环从左边开始合并,也是可以的。那么我们把完整代码写一起,就是这个问题的解了
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
if(lists.length == 0) return null;
if(lists.length == 1) return lists[0];
if(lists.length == 2) return mergeSort(lists[0],lists[1]);
int mid = lists.length/2;
ListNode[] arr1 = new ListNode[mid];
for(int i = 0;i<mid;i++){
arr1[i] = lists[i];
}
ListNode[] arr2 = new ListNode[lists.length - mid];
for(int i = mid;i<lists.length;i++){
arr2[i-mid] = lists[i];
}
return mergeSort(mergeKLists(arr1),mergeKLists(arr2));
}
ListNode mergeSort(ListNode node1,ListNode node2){
ListNode res = new ListNode(-1);
ListNode pre = res;
while(node1 != null && node2 != null){
if(node1.val <= node2.val){
pre.next = node1;
node1 = node1.next;
}else{
pre.next = node2;
node2 = node2.next;
}
pre = pre.next;
}
if(node2 == null){
pre.next = node1;
}
if(node1 == null){
pre.next = node2;
}
return res.next;
}
}
当然这个问题在题目的题解里有更巧妙的方法求,但是这个题目主要的思想还是分治,当我接触的分治算法初体验了。