思路:
Merge Sort解决. 很简单. 但是好像因为用了递归, 所以空间开销其实是logn的…第二遍过得时候再总结纯循环版的吧…
ListNode* merge(ListNode* first, ListNode* second) {
ListNode dummy = ListNode(0);
ListNode* head = &dummy;
while (first && second) {
if (first->val < second->val) {
head->next = first;
first = first->next;
}
else {
head->next = second;
second = second->next;
}
head = head->next;
}
if (first)
head->next = first;
if (second)
head->next = second;
return dummy.next;
}
ListNode* sortList(ListNode* head) {
if (! head || ! head->next)
return head;
ListNode* walker = head, *runner = head;
while (runner->next && runner->next->next) {
walker = walker->next;
runner = runner->next->next;
}
ListNode* first = head;
ListNode* second = walker->next;
walker->next = NULL;
first = sortList(first);
second = sortList(second);
return merge(first, second);
}