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 = newListNode(-1), mid = newListNode(-1), right = newListNode(-1); auto ltail = left, mtail = mid, rtail = right; int val = head -> val;
for (auto p = head; p; p = p -> next) { int pv = p -> val; if (pv < val) ltail = ltail -> next = p; elseif (val == pv) 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(mid) -> next = right -> next;