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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
|
class Solution { public: ListNode* sortList(ListNode* head) { if(!head || !head->next) return head; auto midPoint = getMid(head); auto left = sortList(head); auto right = sortList(midPoint); return mergeList(left, right); } private: ListNode* getMid(ListNode* head) { ListNode* walker = nullptr; ListNode* runner = head; while(runner && runner->next) { walker = !walker ? head : walker->next; runner = runner->next->next; } ListNode* mid = walker->next; walker->next = nullptr; return mid; } ListNode* mergeList(ListNode* l1, ListNode* l2) { if(!l1) return l2; if(!l2) return l1; if(l1->val > l2->val) { l2->next = mergeList(l2->next, l1); return l2; }else { l1->next = mergeList(l1->next, l2); return l1; } return nullptr; } };
|
T(n) : O(nlogn)
总体是分成许多一半一半的,然后每一小部分merge
优化merge
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
|
class Solution { public: ListNode* sortList(ListNode* head) { if(!head || !head->next) return head; auto midPoint = getMid(head); auto left = sortList(head); auto right = sortList(midPoint); return mergeList(left, right); } private: ListNode* getMid(ListNode* head) { ListNode* walker = nullptr; ListNode* runner = head; while(runner && runner->next) { walker = !walker ? head : walker->next; runner = runner->next->next; } ListNode* mid = walker->next; walker->next = nullptr; return mid; } ListNode* mergeList(ListNode* l1, ListNode* l2) { ListNode dummyHead(0); auto prev = &dummyHead; while(l1 && l2) { if(l1->val > l2->val) { prev->next = l2; l2 = l2->next; }else { prev->next = l1; l1 = l1->next; } prev = prev->next; } if(l1) prev->next = l1; else prev->next = l2; return dummyHead.next; } };
|