AcWing 1451. 单链表快速排序


/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
// 思路:
// 准备三个链表,左中右
// 小于 的放左边
// 大于 的放右边
// 等于 的放中间
// 最后拼接在一起即可
class Solution {
public:
    // 找到尾节点
    ListNode* get_tail(ListNode* head){
        while(head->next) head = head->next;
        return head;
    }

    ListNode* quickSortList(ListNode* head) {
        if(!head || !head->next) return head;
        auto left = new ListNode(-1), mid = new ListNode(-1), right = new ListNode(-1);
        auto ltail = left, mtail = mid, rtail = right;
        int val = head->val;
        for(auto p = head; p; p = p->next){
            if(p->val < val) ltail = ltail->next = p;
            else if (p->val == val) mtail = mtail->next = p;
            else rtail = rtail->next = p;
        }
        ltail->next = mtail->next = rtail->next = NULL;
        left->next = quickSortList(left->next);
        right->next = quickSortList(right->next);
        get_tail(left)->next = mid->next;
        get_tail(left)->next = right->next;
        auto p = left->next;
        delete left;
        delete right;
        delete mid;
        return p;
    }
};