力扣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;
		}
	}
}

发布了48 篇原创文章 · 获赞 9 · 访问量 2404

猜你喜欢

转载自blog.csdn.net/jjy19971023/article/details/104501058