class Solution {
public:
ListNode *sortList(ListNode *head) {
if (!head || !head->next)
{
return head;
}
ListNode *p = head;
ListNode *q = head->next;
while (q && q->next)
{
p = p->next;
q = q->next->next;
}
ListNode *left = sortList(p->next);
p->next = NULL;
ListNode *right = sortList(head);
return MergeSort(left, right);
}
ListNode *MergeSort(ListNode *left, ListNode *right)
{
ListNode node(0);
ListNode *p = &node;
while (left && right)
{
if (left->val < right->val)
{
p->next = left;
left = left->next;
}
else
{
p->next = right;
right = right->next;
}
p = p->next;
}
if (left) p->next = left;
if (right) p->next = right;
return node.next;
}
};