【Leetcode】Sort List JAVA实现

Sort a linked list in O(n log n) time using constant space complexity.

1、分析

该题主要考查了链接上的合并排序算法。

2、正确代码实现

package com.edu.leetcode;
import com.edu.leetcode.ListNode;

public class SortList {

    /**
     * @param args
     */
    public ListNode Merge(ListNode first,ListNode second){   //合并两个有序链表,并返回新链表的投结点
        ListNode rear;
        ListNode head;
        rear=head=new ListNode(-1);
        
        while(first!=null&&second!=null){
            if(first.val<=second.val){
                rear.next=first;
                rear=first;
                first=first.next;
            }
            else{
                rear.next=second;
                rear=second;
                second=second.next;
            }
        }
        if(first!=null)
            rear.next=first;
        else
            rear.next=second;
        
        return head.next;
    }
    
    public ListNode sortList(ListNode head){     
        /*
         * 实现链表的合并排序:1、将链表划分成基本相等的两个链表
         * 2、递归将这两个链接继续划分,直到链表的长度为0或者1为止
         * 3、调用Merge()将链接进行合并
         */
        
        if(head==null||head.next==null)
            return head;
        ListNode mid =head;
        ListNode pos =mid.next;
        while(pos!=null){
            pos=pos.next;
            if(pos!=null){
                pos=pos.next;
                mid=mid.next;
            }
        }
        ListNode q=sortList(mid.next);
        mid.next=null;
        return Merge(sortList(head), q);
    }
    
    
    
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ListNode first1 = new ListNode(0);
        ListNode rear1 =first1;
        
        for(int i=9;i>=1;i--){
            ListNode q= new ListNode(i);
            rear1.next=q;
            rear1=q;
        }
        ListNode q=first1;
        while(q!=null){
            System.out.print(q.val+ ",");
            q=q.next;
        }
        System.out.println();
        SortList sl = new SortList();
        sl.sortList(first1);
        
        ListNode p=first1;
        while(p!=null){
            System.out.print(p.val+ ",");
            p=p.next;
        }
        System.out.println();
    }

}

3、有点问题的代码

这里的问题主要是将上面的SortList()方法分成两步实现:Divide()和MergeSort()两部分。个人觉得应该是一样的。但运行结果确实不同,如果大神浏览,请指点一下小弟。。

class ListNode{
    int val;
    ListNode next=null;
    public ListNode(){
    }
    public ListNode(int val){
        this.val=val;
    }
}


public class SortList {
    
    public ListNode Merge(ListNode first,ListNode second){
        ListNode rear;
        ListNode head;
        rear=head=new ListNode();
        
        while(first!=null&&second!=null){
            if(first.val<=second.val){
                rear.next=first;
                rear=first;
                first=first.next;
            }
            else{
                rear.next=second;
                rear=second;
                second=second.next;
            }
        }
        if(first!=null)
            rear.next=first;
        else
            rear.next=second;
        
        return head.next;
    }
    
    public ListNode Divide(ListNode first){    //将一个链表划分成两个基本相等的子链表
        if(first==null)
            return null;
        ListNode mid =first;
        ListNode pos =mid.next;
        while(pos!=null){
            pos=pos.next;
            if(pos!=null){
                pos=pos.next;
                mid=mid.next;
            }
        }
        ListNode q=mid.next;
        mid.next=null;
        return q;
    }
    
    public void MergeSort(ListNode first){     //合并排序
        if(first!=null&&first.next!=null){
            ListNode second =Divide(first);     //将链表划分成两部分
            MergeSort(first);                    //递归
            MergeSort(second);
            Merge(first, second);
        }
        
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ListNode first1 = new ListNode(0);
        ListNode rear1 =first1;
        
        for(int i=9;i>=1;i--){
            ListNode q= new ListNode(i);
            rear1.next=q;
            rear1=q;
        }
        
        
        
        ListNode q=first1;
        while(q!=null){
            System.out.print(q.val+ ",");
            q=q.next;
        }
        System.out.println();
        SortList sl = new SortList();
        sl.MergeSort(first1);
        
        ListNode p=first1;
        while(p!=null){
            System.out.print(p.val+ ",");
            p=p.next;
        }
        System.out.println();
        
    }

}
原文地址:https://www.cnblogs.com/rolly-yan/p/3999240.html