Sort a linked list in O(n log n) time using constant space complexity.
一看要求的时间复杂度,应该使用归并排序:
1、将一条链表一分为二,用快慢指针的方法;
2、合并已排序链表,此步骤可以常数空间复杂度执行。
/**
* 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 *fast = head->next, *slow = head; // 注意初始时fast是slow的下一个元素
while (fast && fast->next)
{
fast = fast->next->next;
slow = slow->next;
}
fast = slow->next;
slow->next = NULL; // 截断
ListNode *l = sortList(head), *r = sortList(fast), *cur = NULL;
while (l || r)
{
if (!r || (l && l->val < r->val))
{
if (!cur) head = cur = l;
else {cur->next = l; cur = l;}
l = l->next;
}
else
{
if (!cur) head = cur = r;
else {cur->next = r; cur = r;}
r = r->next;
}
}
return head;
}
};