連結串列排序(LeetCode 148)
阿新 • • 發佈:2018-11-20
Sort a linked list in O(n log n) time using constant space complexity.
Example 1:Input: 4->2->1->3
Output: 1->2->3->4
Example 2:Input: -1->5->3->4->0
Output: -1->0->3->4->5
用的歸併排序。注意將連結串列對半分的時候,一般的快慢指標的慢指標落在中間節點的下一個,這會導致重複迴圈,所以要做一些微調。
class Solution { public: ListNode* sortList(ListNode* head) { if(!head||!head->next) return head; ListNode *slower=head; ListNode *slow=head->next; ListNode *fast=head->next->next; while(fast&&fast->next){ slower=slower->next; slow=slow->next; fast=fast->next->next; } slower->next=NULL; ListNode *left=sortList(head); ListNode *right=sortList(slow); ListNode *start=new ListNode(0); ListNode *cur=start; while(left&&right){ if(left->val<right->val){ cur->next=left; left=left->next; } else{ cur->next=right; right=right->next; } cur=cur->next; } while(left){ cur->next=left; left=left->next; cur=cur->next; } while(right){ cur->next=right; right=right->next; cur=cur->next; } ListNode *result=start->next; delete start; start=NULL; return result; } };