148. 排序链表
在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。
示例 1:
输入: 4->2->1->3
输出: 1->2->3->4
示例 2:
输入: -1->5->3->4->0
输出: -1->0->3->4->5
解题
复杂度nlogn即为归并排序;
递归方法
分为merge和mergesort两步;
(1)merge
dummyhead维护归并后的链表,并返回;
(2)mergesort
重点在于找到链表中间点并截断;
快慢指针条件:
while(slow&&fast&&fast->next&&fast->next->next){
slow=slow->next;
fast=fast->next->next;
}
偏左的截断(奇数个截断左边);
因为用了递归,所以额外空间不止常数个;
/**
* 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