# 最直白的注释 没有之一
首先这个题目 和上一题其实很类似 。不同的是,该题没有规定需排序数组的个数,遍历寻找每个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; } }