链表排序

来源:互联网 发布:for循环遍历json 编辑:程序博客网 时间:2024/06/06 18:33
// version 1: Merge Sortpublic class Solution {                private ListNode findMiddle(ListNode head) {        ListNode slow = head, fast = head.next;        while (fast != null && fast.next != null) {            fast = fast.next.next;            slow = slow.next;        }        return slow;    }        private ListNode merge(ListNode head1, ListNode head2) {        ListNode dummy = new ListNode(0);        ListNode tail = dummy;        while (head1 != null && head2 != null) {            if (head1.val < head2.val) {                tail.next = head1;                head1 = head1.next;            } else {                tail.next = head2;                head2 = head2.next;            }            tail = tail.next;        }        if (head1 != null) {            tail.next = head1;        } else {            tail.next = head2;        }        return dummy.next;     }    public ListNode sortList(ListNode head) {        if (head == null || head.next == null) {            return head;        }        ListNode mid = findMiddle(head);        ListNode right = sortList(mid.next);        mid.next = null;        ListNode left = sortList(head);        return merge(left, right);    }}// version 2: Quick Sort 1public class Solution {    public ListNode sortList(ListNode head) {        if (head == null || head.next == null) {            return head;        }                ListNode mid = findMedian(head); // O(n)                ListNode leftDummy = new ListNode(0), leftTail = leftDummy;        ListNode rightDummy = new ListNode(0), rightTail = rightDummy;        ListNode middleDummy = new ListNode(0), middleTail = middleDummy;        while (head != null) {            if (head.val < mid.val) {                leftTail.next = head;                leftTail = head;            } else if (head.val > mid.val) {                rightTail.next = head;                rightTail = head;            } else {                middleTail.next = head;                middleTail = head;            }            head = head.next;        }                leftTail.next = null;        middleTail.next = null;        rightTail.next = null;                ListNode left = sortList(leftDummy.next);        ListNode right = sortList(rightDummy.next);                return concat(left, middleDummy.next, right);    }        private ListNode findMedian(ListNode head) {        ListNode slow = head, fast = head.next;        while (fast != null && fast.next != null) {            slow = slow.next;            fast = fast.next.next;        }        return slow;    }        private ListNode concat(ListNode left, ListNode middle, ListNode right) {        ListNode dummy = new ListNode(0), tail = dummy;                tail.next = left; tail = getTail(tail);        tail.next = middle; tail = getTail(tail);        tail.next = right; tail = getTail(tail);        return dummy.next;    }        private ListNode getTail(ListNode head) {        if (head == null) {           return null;        }                while (head.next != null) {            head = head.next;        }        return head;    }}//sort arraypublic class Solution {    /**     * @param A an integer array     * @return void     */    public void sortIntegers2(int[] A) {        // use a shared temp array, the extra memory is O(n) at least        int[] temp = new int[A.length];        mergeSort(A, 0, A.length - 1, temp);    }        private void mergeSort(int[] A, int start, int end, int[] temp) {        if (start >= end) {            return;        }                int left = start, right = end;        int mid = (start + end) / 2;        mergeSort(A, start, mid, temp);        mergeSort(A, mid+1, end, temp);        merge(A, start, mid, end, temp);    }        private void merge(int[] A, int start, int mid, int end, int[] temp) {        int left = start;        int right = mid+1;        int index = start;                // merge two sorted subarrays in A to temp array        while (left <= mid && right <= end) {            if (A[left] < A[right]) {                temp[index++] = A[left++];            } else {                temp[index++] = A[right++];            }        }        while (left <= mid) {            temp[index++] = A[left++];        }        while (right <= end) {            temp[index++] = A[right++];        }                // copy temp back to A        for (index = start; index <= end; index++) {            A[index] = temp[index];        }    }}