23. 合并K个排序链表-LeetCode

心得:仿照归并排序,两两合并,注意更新的判断条件,注意事项看代码!!!

注意判断条件。

**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
   public ListNode mergeKLists(ListNode[] lists)
	 {
		 if(lists==null||lists.length==0)
			 return null;
		 int n=lists.length;
		while(n>1) 
		{
		 for(int i=0;i<(n+1)/2;i++)
		 {
			 lists[i]=mergeArr(lists,i,i+(n+1)/2,n);
		 }
		 n=(n+1)/2;
		}
		return lists[0];
	 }
	 public ListNode mergeArr(ListNode[] lists,int a,int b,int n)
			 {
		       if(b>=n)   /////此处n非常重要,一定要记得传入,否则会导致死循环!!!
			  return lists[a];
		      ListNode head=new ListNode(1);
		      ListNode tmp=head;
		      while(lists[a]!=null&&lists[b]!=null)
		      {
		    	  if(lists[a].val>lists[b].val)
		    	  {
		    		  tmp.next=lists[b];
		    		//  tmp=tmp.next;
		    		  lists[b]=lists[b].next;
		    		  tmp=tmp.next;
		    	  }
		    	  else
		    	  {
		    		  tmp.next=lists[a];
		    		 // tmp=tmp.next;
		    		  lists[a]=lists[a].next;
		    		  tmp=tmp.next;
		    	  }
		      }
		      if(lists[a]==null)
		      {
		    	  tmp.next=lists[b];
		      }
		      if(lists[b]==null)
		      {
		    	  tmp.next=lists[a];
		      }
		      return head.next;
			 }
}

  

猜你喜欢

转载自www.cnblogs.com/pc-m/p/10883523.html