给定一个单链表,请使用快速排序算法对其排序。
要求:期望平均时间复杂度为 O(nlogn),期望额外空间复杂度为 O(logn)。
思考题:
如果只能改变链表结构,不能修改每个节点的val值该如何做呢?
数据范围:
链表中的所有数大小均在 int 范围内,链表长度在 [0,10000]。
本题数据完全随机生成。
输入样例:
[5, 3, 2]
输出样例:
[2, 3, 5]
class Main {
public:
ListNode *getTail(ListNode *head) {
while (head->next)
head = head->next;
return head;
}
ListNode *quickSortList(ListNode *head) {
// 遍历链表,按照三种情况分别加到三个链表中
// 空结点或单结点
if (!head || !head->next) return head;
ListNode *lhead = new ListNode(-1), *mhead = new ListNode(-1), *rhead = new ListNode(-1);
auto left = lhead, mid = mhead, right = rhead;
// 遍历链表
int x = head->val;
for (auto p = head; p; p = p->next) {
if (p->val < x)
left = left->next = p;
else if (p->val == x)
mid = mid->next = p;
else
right = right->next = p;
}
// 得到三个链表,递归左边和右边链表
left->next = mid->next = right->next = nullptr;
lhead->next = quickSortList(lhead->next);
rhead->next = quickSortList(rhead->next);
// 拼接链表
getTail(lhead)->next = mhead->next;
getTail(mhead)->next = rhead->next;
auto re = lhead->next;
delete lhead;
delete mhead;
delete rhead;
return re;
}
};