这道题一开始就选择了for循环,就是提交的时候超时了,原理就是两两合并,合并使用递归就行。看了别人的,说是用分治算法,就是从中间劈开,左边合并左边的,右边合并右边的,最后两边再合并。也需要使用递归,就是左边不断中劈,直到相邻两个合并。
import java.util.*;
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode mergeKLists(ArrayList<ListNode> lists) {
// if(lists == null || lists.size()==0)return null;
// if(lists.size()==1)return lists.get(0);
// ListNode node = lists.get(0);
// for(int i=1;i<lists.size();i++){
// node=mergeListNode(node,lists.get(i));
// }
// return node;
return mergeList(lists,0,lists.size()-1);
}
public ListNode mergeList(ArrayList<ListNode> lists ,int left,int right){
if(left>right)return null;
if(left==right)return lists.get(left);
int mid = left+(right-left)/2;
return mergeListNode(mergeList(lists,left,mid),mergeList(lists,mid+1,right));
}
public ListNode mergeListNode(ListNode head1 , ListNode head2){
if(head1==null)return head2;
if(head2==null)return head1;
if(head1.val<=head2.val){
head1.next = mergeListNode(head1.next,head2);
return head1;
}else{
head2.next = mergeListNode(head1,head2.next);
return head2;
}
}
}