leecode 归并排序 链表(java)

写了好久,终于写成了.第一次zai leecode错题,题目质量很高,适合面试,与

1.归并排序是稳定的,在java中 Arrays.sort(a);中对于对象的排序就是归并排序。对于原子类型数据使用的是快排。

2.算法复杂度,我们都知道归并排序的最好最坏最差复杂度为nlogn,空间复杂度为n,在链表当中,空间复杂度j降为O(1)。

3.写链表的排序

1.分: 使用书上的快慢指针来获得中间节点,分割成2个链表

2.和: 将两个链表合成一个,比较简单

3.

主程序

ListNode lmerge(ListNode list)

{

if(list==null)  return  null;//如果是空链表

if(list.next==null) return list;//单个节点

//以下是多节点的情况

1分割 返回中间的地址   middle=split(head)

return (middle,head); 、、 返回连接后的地址

 

 

}

package LinkedListSort;

class ListNode {

        int val;

        ListNode next;

        ListNode(int x) {

            val = x;

            next = null;

        }

     }



public class LinklistSort {

    

    public static ListNode create(int a[])

    {

      ListNode head=new ListNode(a[0]);

      for(int i=1;i<a.length ;i++)

      {

          ListNode node=new ListNode(a[i]);

          node.next=head.next;

          head.next=node;

          

          

          

      }

      return head;

        

        

    }

    public static void display(ListNode head)

    {

        ListNode list=head;

        while(list!=null)

        {

            

            System.out.print(list.val+"--");

            list=list.next;

            

        }

        System.out.println();

        

        

    }

    

   public static ListNode sortList(ListNode head) {

       //没有一个节点

       if(head==null) return null;

       //有一个节点

       if(head.next==null) return head;  

       //有两个以上的节点

     

       

       ListNode middle=split(head);

      

       return merge(sortList(head),sortList(middle));

      

     

       

       

        

    }



    private static ListNode merge(ListNode head, ListNode middle) {

    

        ListNode p1=head;

        ListNode p2=middle;

        ListNode h=new ListNode(-1);//一个new头

        ListNode tail=h;

        

        while(p1!=null&&p2!=null)

        {

            if(p1.val<=p2.val)

            {

                

                tail.next=p1;

                tail=tail.next;

                p1=p1.next;

                

                

                

            }

            else

            {

                tail.next=p2;

                tail=tail.next;

                

                p2=p2.next;

                

            }

            

            

            

        }

    

        if(p1!=null)

        {

            tail.next=p1;

            

        }

        if(p2!=null)

        {

            tail.next=p2;

        }

        

        return h.next ;

}

    //分成两部分的部分

    private static ListNode split(ListNode head) {

        ListNode quick=head;

        ListNode slow=head;

        ListNode pre=null;

        while(quick!=null)

        {

            pre=slow;

            slow=slow.next;

            quick=quick.next;

            if(quick!=null) quick=quick.next ;

            

                

            

            

        }

        pre.next =null;

    return slow;

}

    public static void main(String[] args) {

        // TODO Auto-generated method stub

        int a[]={1,3,-5,8,56,44,56};

         ListNode list=create(a);

        // display(list);

         ListNode l=sortList(list);

        

         display(l);

        

         



    }



}

你可能感兴趣的:(java)