链表排序

在 O(n log n) 时间复杂度和常数级的空间复杂度下给链表排序。

样例

给出 1->3->2->null,给它排序变成 1->2->3->null.

import java.util.Scanner;

/**
 * 在 O(n log n) 时间复杂度和常数级的空间复杂度下给链表排序。
样例
给出 1->3->2->null,给它排序变成 1->2->3->null.
 *对链表分别进行快速排序和归并排序
 * @author Dell
 *
 */
public class Test98 {
   public static ListNode sortList(ListNode head)
   {
	   quicksort(head,null);
	return head;
 
   }
   //链表的快速排序
   public static ListNode partition(ListNode start,ListNode end)
   {
	    int x=start.val;
	    ListNode i=start;
	    ListNode j=i.next;
	   while(j!=end)
	   {
		   if(j.val<x)
		   {
			   i=i.next;
			   int temp=i.val;
			   i.val=j.val;
			   j.val=temp;  
		   }
		   j=j.next;
	   }
	   
	   int temp1=i.val;
	   i.val=start.val;
	   start.val=temp1;
	   return i;  
   }
   public static void quicksort(ListNode begin,ListNode end)
   {
	   if(begin!=end)
	   {
		   ListNode p=partition(begin,end);
		   quicksort(begin,p);
		   quicksort(p.next,end);	   
	   }
	   
   }
   
   //链表的归并排序
   public static ListNode Merge(ListNode A, ListNode B)
   {
	   ListNode p=A;
	   ListNode q=B;
	   ListNode result=new ListNode(-1);
	   ListNode r=result;
	   while(p!=null&&q!=null)
	   {
		   if(p.val<q.val)
		   {
			   r.next=p;
			   p=p.next;
		   }
		   else
		   {
			   r.next=q;
			   q=q.next;   
		   }
		   r=r.next;
	   }
	 if(p!=null)
	 {
		 r.next=p;
	 }
	 if(q!=null)
	 {
		 r.next=q;
	 }
	 return result.next;  
   }
   
   public static ListNode Mergesort(ListNode head)
   {
	   if(head==null||head.next==null)
		   return head;
	   
		   ListNode mid=find(head);
		   ListNode later=mid.next;
		   mid.next=null;
		return Merge(Mergesort(head),Mergesort(later));
	 
     
   }
   public static ListNode find(ListNode head)
   {
	   ListNode slow=head;
	   ListNode fast=head;
	   while(fast.next!=null&&fast.next.next!=null)
	   {
		   slow=slow.next;
		   fast=fast.next.next;
	   }
	   return slow;
   }
   public static ListNode sortList1(ListNode head)
   {
	   
	return Mergesort(head);
 
   }
	public static void main(String[] args) {
      Scanner sc=new Scanner(System.in);
      int n=sc.nextInt();
      ListNode list=new ListNode(-1);
      ListNode p=list;
      for(int i=0;i<n;i++)
      {
    	  ListNode temp=new ListNode(sc.nextInt());
    	  p.next=temp;
    	  p=p.next;
      }
      ListNode result=sortList1(list.next);
      while(result!=null)
      {
    	  System.out.print(result.val+" ");
    	  result=result.next;
      }
	}

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值