Leetcode: Sort List - 快排

来源:互联网 发布:企业的大数据平台 编辑:程序博客网 时间:2024/06/05 11:50

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

写呀写,一次又一次,总是搞不定,要么运行出错,要么超时。网上看了一下,原来需要考虑重复pivot的情况。总算过了。

/** * Definition for singly-linked list. * struct ListNode { *     int val; *     ListNode *next; *     ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public:    ListNode *sortList(ListNode *head) {        if (head == NULL) {            return NULL;        }                ListNode *last = head;        while (last->next != NULL) {            last = last->next;        }                return listQuickSort(head, last);    }        ListNode *listQuickSort(ListNode *&head, ListNode *&last) {        if (head != NULL && last != NULL && head != last) {            ListNode *ltail = NULL;            ListNode *pivot = NULL;            ListNode *ptail = NULL;            ListNode *rhead = NULL;            listPartition(head, ltail, pivot, ptail, rhead, last);                        listQuickSort(head, ltail);            listQuickSort(rhead, last);                        if (ltail != NULL) {                ltail->next = pivot;            }            else {                head = pivot;            }            ptail->next = rhead;            if (last == NULL) {                last = ptail;            }        }                return head;    }        void listPartition(ListNode *&head, ListNode *<ail,                             ListNode *&pivot, ListNode *&ptail,                            ListNode *&rhead, ListNode *&last) {        ListNode lguard(0);        ltail = &lguard;        ListNode pguard(0);        pivot = &pguard;        ptail = last;        ListNode *cur = head;        while (cur != ptail) {            if (cur->val < ptail->val) {                ltail->next = cur;                ltail = cur;            }            else if (cur->val > ptail->val) {                last->next = cur;                last = cur;            }            else {                pivot->next = cur;                pivot = cur;            }            cur = cur->next;        }                head = lguard.next;        pivot->next = ptail;        pivot = pguard.next;        if (ltail == &lguard) {            head = NULL;            ltail = NULL;        }        else {            ltail->next = pivot;        }        last->next = NULL;        if (last == ptail) {            rhead = NULL;            last = NULL;        }        else {            rhead = ptail->next;        }    }};


0 0