链表归并排序

来源:互联网 发布:mac系统修复软件 编辑:程序博客网 时间:2024/05/29 10:39
package com.Tecent.success.sg;import java.util.Scanner;/** * 归并排序链表版 *  * @author Dell * */class ListNode{public int val;public ListNode next;public ListNode(int val){      this.val=val;}}public class GuiBing2 {public static ListNode MergeSort(ListNode head){    if(head==null||head.next==null)   //很关键,只剩下一个元剩时要单独处理    return head;   ListNode mid= findmid(head);   ListNode post=mid.next;   mid.next=null;  return merge(MergeSort(head),MergeSort(post));}public static ListNode findmid(ListNode head){         if(head==null||head.next==null)         return 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 merge(ListNode list1, ListNode list2){  if(list1==null&&list2!=null)  return list2;  if(list1!=null&&list2==null)  return list1;  if(list1==null&&list2==null)  return null;    ListNode p=list1;    ListNode q=list2;    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 void main(String[] args) {Scanner sc=new Scanner(System.in);int n=sc.nextInt();ListNode head=new ListNode(-1);ListNode p=head;for(int i=0;i<n;i++){ListNode temp=new ListNode(sc.nextInt());p.next=temp;p=p.next;}     ListNode result=MergeSort(head.next); while(result!=null) { System.out.print(result.val+" "); result=result.next; }}}

原创粉丝点击