Sort a linked list in O(n log n) time using constant space complexity.
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution
{
public:
ListNode *mid(ListNode *head)
{
ListNode *start = new ListNode(0);
start->next = head;
ListNode *fast = start;
ListNode *slow = start;
while(fast->next && fast->next->next)
{
slow = slow->next;
fast = fast->next;
fast = fast->next;
}
ListNode *head2 = slow->next;
cout << head2->val;
slow->next = NULL;
return head2;
}
ListNode* merge(ListNode *head1, ListNode *head2)
{
ListNode *head = new ListNode(0);
ListNode *p = head;
while(head1 && head2)
{
if(head1->val < head2->val)
{
head->next = head1;
head1 = head1->next;
head = head->next;
}
else
{
head->next = head2;
head2 = head2->next;
head = head->next;
}
}
if(head1)
head->next = head1;
else
head->next = head2;
return p->next;
}
ListNode* sortList(ListNode* head)
{
if(head == NULL)
return NULL;
if(head->next == NULL)
return head;
ListNode *head1 = mid(head);
return merge(sortList(head), sortList(head1));
}
};