Sort List Posted on 2018-10-03 Description###Quicksort 1234567891011121314151617181920212223242526272829303132333435363738/** * 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 || head->next == NULL) return head; sort(head, NULL); return head; } void sort(ListNode* start, ListNode* end) { if (start == end || start->next == end) return; ListNode* mid = partition(start, end); sort(start, mid); sort(mid->next, end); } ListNode* partition(ListNode* start, ListNode* end) { int midValue = start->val; ListNode* cur = start->next; ListNode* mid = start; while (cur != end) { if (cur->val < midValue) { mid = mid->next; swap(mid->val, cur->val); } cur = cur->next; } swap(mid->val, start->val); return mid; }}; Mergesort12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849/** * 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 || head->next == NULL) return head; ListNode* ret = sort(head); return ret; } ListNode* sort(ListNode* start) { if (!start || !start->next) return start; ListNode* slow = start; ListNode* quick = start; while (quick && quick->next && quick->next->next) { slow = slow->next; quick = quick->next->next; } ListNode* left = sort(slow->next); slow->next = NULL; ListNode* right = sort(start); return merge(left, right); } ListNode* merge(ListNode* left, ListNode* right) { ListNode* fake = new ListNode(-1); ListNode* cur = fake; while (left != NULL && right != NULL) { if (left->val < right->val){ cur->next = left; left = left->next; }else { cur->next = right; right = right->next; } cur = cur->next; } cur->next = left ? left : right; ListNode* ret = fake->next; delete fake; return ret; }};