# 最直白的注释 没有之一
首先这个题目 和上一题其实很类似 。不同的是,该题没有规定需排序数组的个数,遍历寻找每个ListNode里面的最小值,之后再添加对Head.next进行选择的话 时间复杂度O(n^2)当数据很大时时间会超时
暴力解法 超时了
ListNode head = new ListNode(-1001);
ListNode cur = head;
while(!lists.isEmpty()){
int min=0,minValue=1001;
for(int i=0;i<lists.size();i++){
// ListNode 原始为null的情况
if(lists.get(i)==null){
lists.remove(i);
continue;
}//不断选择每个ListNode第一个里面的最小值
if(lists.get(i).val<minValue){
min =i;
minValue = lists.get(i).val;
}
}//使用cur来对其进行排序
cur.next = lists.get(min);
cur = cur.next;
//取到值的List 跳到下一个节点去 这里选择先删后添加新的
ListNode tmp = lists.get(min);
tmp = tmp.next;
lists.remove(min);
if(tmp!=null)
lists.add(tmp);
}
return head.next;
### 归并排序
题目要求时间复杂度O(nlogn) 应该想到二分的思路。
public ListNode mergeKLists(ArrayList<ListNode> lists) {
//使用归并排序 说白就是把其分为一半一半来排序 再合成为大的
if(lists.size()==1)
return lists.get(0);
return mergeList(lists,0,lists.size()-1);
}
ListNode mergeList(ArrayList<ListNode> lists,int left,int right){
if(left==right)
return lists.get(left);
if(left>right)
return null;
int mid = left + (right-left)/2;
//[left,mid]
ListNode l = mergeList(lists,left,mid);
//[mid+1.right]
ListNode r = mergeList(lists,mid+1,right);
return merge(l,r);
}
ListNode merge(ListNode l,ListNode r){
//这里就是上一题的合并两个排序链表
//使用递归方便一点(也可以构造链表法)
if(l==null) return r;
if(r==null) return l;
if(l.val<r.val){
l.next = merge(l.next,r);
return l;
}else{
r.next = merge(l,r.next);
return r;
}
}



京公网安备 11010502036488号