题目描述:
思路:时间复杂度是O(n log n),我们会想到二分法,从而联想到归并排序;所以首先对链表进行拆分,然后再进行归并。
/**
* 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==nullptr||head->next==nullptr)
return head;
ListNode *slow=head;
ListNode *fast=head->next;
//找到中节点
while(fast!=nullptr&&fast->next!=nullptr){
slow=slow->next;
fast=fast->next->next;
}
//分割链表
ListNode *tmp=slow->next;
slow->next=nullptr;
//递归
ListNode *left=sortList(head);
ListNode *right=sortList(tmp);
//创建一个新节点,保存结果
ListNode header(-1);
ListNode *h = &header;
//归并
while(left!=nullptr&&right!=nullptr){
if(left->val<right->val){
h->next=left;
left=left->next;
}else{
h->next=right;
right=right->next;
}
h=h->next;
}
//将不为空的部分直接加到h尾部
h->next=left!=nullptr?left:right;
return header.next;
}
};