题目描述
给定一个单链表,请使用 O(nlogn)O(nlogn) 的时间复杂度和额外 O(1)O(1) 的空间复杂度对其进行排序。
样例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* sortList(ListNode* head) {
if(!head||!head->next) return head;
ListNode *slow = head,*fast = head,*pre = head;//快慢指针,pre指向慢指针前面的结点,方便解链
while(fast&&fast->next){
pre = slow;
slow = slow->next;
fast = fast->next->next;
}//找到中
pre->next = NULL;//解链
return merge(sortList(head),sortList(slow));//归并
}
ListNode* merge(ListNode* l1, ListNode* l2) {
if(!l1) return l2;//只有一条,直接返回
if(!l2) return l1;
if(l1->val<l2->val){//l1小,将l1插入在前面
l1->next = merge(l1->next,l2);
return l1;
}
else{
l2->next = merge(l2->next,l1);//反之l2
return l2;
}
}
};