騰訊//排序連結串列
阿新 • • 發佈:2018-12-17
在 O(n log n) 時間複雜度和常數級空間複雜度下,對連結串列進行排序。
示例 1:
輸入: 4->2->1->3 輸出: 1->2->3->4
示例 2:
輸入: -1->5->3->4->0 輸出: -1->0->3->4->5
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* findMiddle(ListNode* head){ if(head!=nullptr&&head->next==nullptr) return head; if(head!=nullptr&&head->next!=nullptr&&head->next->next==nullptr) return head; ListNode* fast = head; ListNode* slow = head; while(fast->next!=nullptr&&fast->next->next!=nullptr){ fast = fast->next->next; slow = slow->next; } return slow; } ListNode* merge(ListNode* first, ListNode* second){ ListNode* head = new ListNode(0); head->next = first->val<=second->val?first:second; ListNode* tail = head; while(first!=nullptr&&second!=nullptr){ if(first->val<=second->val){ tail->next=first; tail=first; first=first->next; }else{ tail->next=second; tail=second; second=second->next; } } if(first!=nullptr) tail->next=first; if(second!=nullptr) tail->next=second; return head->next; } ListNode* mergeSort(ListNode* head){ if(head->next==nullptr) return head; auto mid = findMiddle(head); auto mid_next = mid->next; mid->next = nullptr; auto first = mergeSort(head); auto second = mergeSort(mid_next); return merge(first, second); } ListNode* sortList(ListNode* head) { if(head==nullptr || head->next==nullptr) return head; return mergeSort(head); } };