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

 

排序,要求是O(nlog(n))的时间复杂度和常数的空间复杂度,那么就使用归并就可以了。

 

 

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
public class Solution {
    
    public ListNode sortList(ListNode head) {
        if( head == null || head.next == null)
            return head;

        int size = 1;
        ListNode start = new ListNode(0);
        start.next = head;
        
        while( true ){
            ListNode node1 = start;
            ListNode node2 = start.next;
            for( int i = 0 ; i < size && node2!=null;i++){
                node2 = node2.next;
            }

            if( node2 == null )
                break;
            ListNode nnn = start.next;
            
            while( node2 != null ){
                node1 = helper(node1,node2,size);
                if( node1 == null  )
                    break;
                node2 = node1.next;
                for( int i = 0 ; i< size && node2 != null;i++){
                    node2 = node2.next;
                }
            }  
            size*=2;
        }
        return start.next;
    }

    public ListNode helper(ListNode node1,ListNode node2,int size){

        
        int num1 = 0,num2 = 0;
        
        ListNode node = null;
        
        
        if( node1.next.val < node2.val ){
            node = node1.next;
            node1 = node1.next.next;
            num1++;
        }else{
            ListNode nn = node1.next;
            node1.next = node2;
            node1 = nn;
            node = node2;
            node2 = node2.next;
            num2++;
        }

        while( num1 < size && num2 < size && node1 != null && node2 != null){

            
            if( node1.val < node2.val ){
                node.next = node1;
                node = node1;
                node1 = node1.next;
                num1++;
            }else{
                node.next = node2;
                node = node2;
                node2 = node2.next;
                num2++;
            }
        }
        while( num1 < size && node1 != null){
            node.next = node1;
            node = node1;
            node1 = node1.next;
            num1++;
        }

        while( num2 < size && node2 != null){
            node.next = node2;
            node = node2;
            node2 = node2.next;
            num2++;
        }
        node.next = node2;
        return node;

    }
}