腾讯//排序链表
在 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);
}
};