单链表快速排序
思路:
和普通快排一样,递归实现遍历。递归的每一层都遍历一遍当前的链表,将链表按照节点值分成三部分:等于枢轴值、小于枢轴值和大于枢轴值。递归排序后,将三段链表进行拼接。
时空复杂度:
平均时间复杂度为 O(nlogn),额外空间复杂度为 O(logn)。
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| class Solution { public: ListNode* get(ListNode* head) { while(head->next) head = head->next; return head; } ListNode* quickSortList(ListNode* head) { if(!head || !head->next) return head; ListNode *s = new ListNode(-1), *e = new ListNode(-1), *l = new ListNode(-1); ListNode *st = s, *et = e, *lt = l; int v = head->val; for(auto iter = head; iter != nullptr; iter = iter->next) { if(iter->val < v) st = st->next = iter; else if(iter->val == v) et = et->next = iter; else lt = lt->next = iter; } st->next = et->next = lt->next = nullptr; s->next = quickSortList(s->next); l->next = quickSortList(l->next); get(s)->next = e->next; get(s)->next = l->next; auto res = s->next; delete s, e, l; return res; } };
|