合併 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;
}
}
}