[LeetCode]148 Sort List

https://oj.leetcode.com/problems/sort-list/

http://blog.csdn.net/linhuanmars/article/details/21133949

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public ListNode sortList(ListNode head) {
        return mergeSort(head);
    }
    
    private ListNode mergeSort(ListNode head)
    {
        if (head == null || head.next == null)
            return head;
            
        ListNode midpre = midpre(head);
        ListNode mid = midpre.next;
        midpre.next = null;
        
        head = mergeSort(head);
        mid = mergeSort(mid);
        return merge(head, mid);
    }
    
    private ListNode merge(ListNode a, ListNode b)
    {
        if (a == null && b == null)
            return null;
            
        ListNode dummyhead = new ListNode(0);
        ListNode pre = dummyhead;
        while (a != null && b != null)
        {
            ListNode node;
            if (a.val < b.val)
            {
                node = a;
                a = a.next;
            }
            else
            {
                node = b;
                b = b.next;
            }
            pre.next = node;
            pre = node;
        }
        
        while (a != null)
        {
            pre.next = a;
            pre = a;
            a = a.next;
        }
        
        while (b != null)
        {
            pre.next = b;
            pre = b;
            b = b.next;            
        }
        
        return dummyhead.next;
    }
    
    private ListNode midpre(ListNode a)
    {
        if (a == null || a.next == null)
            return a;
            
        ListNode dummyhead = new ListNode(0);
        dummyhead.next = a;
        ListNode pre = dummyhead;
        while (a != null)
        {
            a = a.next;
            if (a == null)
            {
                break;
            }
            a = a.next;
            pre = pre.next;
        }
        return pre;
    }
}


你可能感兴趣的:(LeetCode)