力扣23,合併K個排序鏈表

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章