解法一://全部打乱用ArrayList存,在新建链表
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
List<Integer> list=new ArrayList<>();
if(lists==null){
return null;
}
for(ListNode listNode:lists){
while(listNode!=null){
list.add(listNode.val);
System.out.println(listNode.val);
listNode=listNode.next;
}
}
System.out.println(list.toString());
Collections.sort(list);
ListNode h=null;
ListNode j=null;
for(int i=0;i<list.size();i++){
if(i==0){
h=j=new ListNode(list.get(0));
}else{
j.next=new ListNode(list.get(i));
j=j.next;
}
}
return h;
}
解法二:两个两个合并
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
ListNode ans=null;
for(int i=0;i<lists.length;i++){
ans=mergeTwoLists(ans,lists[i]);
}
return ans;
}
public static ListNode mergeTwoLists(ListNode a,ListNode b){
if(a==null||b==null){
return a!=null?a:b;
}
ListNode h=new ListNode(0);
ListNode tail=h;
ListNode pa=a;
ListNode pb=b;
while(pa!=null&&pb!=null){
if(pa.val<=pb.val){
tail.next=pa;
pa=pa.next;
}else if(pa.val>pb.val){
tail.next=pb;
pb=pb.next;
}
tail=tail.next;
}
tail.next=(pa!=null?pa:pb);
return h.next;
}
}
解法三:分治合并
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
if(lists.length==0){
return null;
}
int l=0;
int r=lists.length-1;
return merge(lists,l,r);
}
public static ListNode merge(ListNode[] lists,int l,int r){
if(l==r){
return lists[l];
}
int mid= (l+r) /2;
ListNode i=merge(lists,l,mid);
ListNode j=merge(lists,mid+1,r);
return mergeTwoLists(i,j);
}
public static ListNode mergeTwoLists(ListNode a,ListNode b){
if(a==null||b==null){
return a!=null?a:b;
}
ListNode h=new ListNode(0);
ListNode tail=h;
ListNode pa=a;
ListNode pb=b;
while(pa!=null&&pb!=null){
if(pa.val<=pb.val){
tail.next=pa;
pa=pa.next;
}else if(pa.val>pb.val){
tail.next=pb;
pb=pb.next;
}
tail=tail.next;
}
tail.next=(pa!=null?pa:pb);
return h.next;
}
}