合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6
我思考到的 这一题也有两种解法:
1、暴力法,把这个链表完整的取出来放到一个数组中,然后将数组进行排序。最后输出即可
2、是借用软件工程的一种思想,把问题转化为简单的问题,也就是我们一组不会操作。但是我们可以从中选两个链表进行合并啊,把问题简单化。实现起来也没有太麻烦呢
。
具体代码实现如下:
package medium;
import java.util.Arrays;
public class mergeList {
public ListNode mergeKLists(ListNode[] lists) {
ListNode renode=new ListNode(0);
int size=0;
for(int i=0;i<lists.length;i++){
ListNode Ltemp=lists[i];
int temp=0;
while(Ltemp!=null){
temp++;
Ltemp=Ltemp.next;
}
size=size+temp;
}
int[] co=new int[size];
int f=0;
for(int j=0;j<lists.length;j++){
ListNode Ltemp=lists[j];
while(Ltemp!=null){
co[f]=Ltemp.val;
Ltemp=Ltemp.next;
f++;
}
}
Arrays.sort(co);
ListNode p=renode;
for(int i=0;i<size;i++){
ListNode tt=new ListNode(co[i]);
p.next=tt;
p=p.next;
}
return renode.next;
}
public ListNode mergeKLists2(ListNode[] lists) {
ListNode renode=new ListNode(0);
if(lists.length==0){
return renode.next;
}
renode.next=lists[0];
for(int i=1;i<lists.length;i++){
lists[0]=mergeTwo(lists[0],lists[i]);
}
return lists[0];
}
private ListNode mergeTwo(ListNode l1, ListNode l2) {
ListNode head=new ListNode(0);
ListNode p=head;
while(l1!=null&&l2!=null){
if(l1.val>l2.val){
p.next=l2;
l2=l2.next;
}else{
p.next=l1;
l1=l1.next;
}
p=p.next;
}
if(l1!=null){
p.next=l1;
}
else if(l2!=null){
p.next=l2;
}
return head.next;
}
public static void main(String[] args) {
ListNode l1=new ListNode(0);
ListNode l2=new ListNode(1);
ListNode[] l={l1,l2};
mergeList t=new mergeList();
ListNode l3=t.mergeKLists(l);
while(l3!=null)
{
System.out.println(l3.val);
l3=l3.next;
}
}
}