链表排序

来源:互联网 发布:linux samba建用户 编辑:程序博客网 时间:2024/06/05 17:54

归并排序

public 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);    }}

快排
Version1

public 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;

Version2

class Pair {    public ListNode first, second;     public Pair(ListNode first, ListNode second) {        this.first = first;        this.second = second;    }}public class Solution {    /**     * @param head: The head of linked list.     * @return: You should return the head of the sorted linked list,                    using constant space complexity.     */    public ListNode sortList(ListNode head) {        if (head == null || head.next == null) {            return head;        }        ListNode mid = findMedian(head); // O(n)        Pair pair = partition(head, mid.val); // O(n)        ListNode left = sortList(pair.first);        ListNode right = sortList(pair.second);        getTail(left).next = right; // O(n)        return left;    }    // 1->2->3 return 2    // 1->2 return 1    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;    }    // < value in the left, > value in the right    private Pair partition(ListNode head, int value) {        ListNode leftDummy = new ListNode(0), leftTail = leftDummy;        ListNode rightDummy = new ListNode(0), rightTail = rightDummy;        ListNode equalDummy = new ListNode(0), equalTail = equalDummy;        while (head != null) {            if (head.val < value) {                leftTail.next = head;                leftTail = head;            } else if (head.val > value) {                rightTail.next = head;                rightTail = head;            } else {                equalTail.next = head;                equalTail = head;            }            head = head.next;        }        leftTail.next = null;        rightTail.next = null;        equalTail.next = null;        if (leftDummy.next == null && rightDummy.next == null) {            ListNode mid = findMedian(equalDummy.next);            leftDummy.next = equalDummy.next;            rightDummy.next = mid.next;            mid.next = null;        } else if (leftDummy.next == null) {            leftTail.next = equalDummy.next;        } else {            rightTail.next = equalDummy.next;        }        return new Pair(leftDummy.next, rightDummy.next);    }    private ListNode getTail(ListNode head) {        if (head == null) {           return null;        }         while (head.next != null) {            head = head.next;        }        return head;    }}

插入排序

class Solution {public:    /**     * @param head: The first node of linked list.     * @return: The head of linked list.     */    ListNode *insertionSortList(ListNode *head) {        ListNode *dummy = new ListNode(0);        while (head != NULL) {            ListNode *temp = dummy;            ListNode *next = head->next;            while (temp->next != NULL && temp->next->val < head->val) {                temp = temp->next;            }            head->next = temp->next;            temp->next = head;            head = next;        }        return dummy->next;    }};
0 0
原创粉丝点击