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* sortList(ListNode* head) {
if(head == NULL || head->next == NULL) {
return head;
}
ListNode* p1 = head;
ListNode* p2 = head;
ListNode* head1 = head;
ListNode* head2 = head;
while(p2) {
p2 = p2->next;
if(p2) {
p2 = p2->next;
}
if(!p2) {
head1 = p1->next;
p1->next = NULL;
} else {
p1 = p1->next;
}
}
head2 = sortList(head1);
head1 = sortList(head);
ListNode* p = head1;
p1 = head1;
p2 = head2;
if(head2->val < head1->val) {
p = head2;
p2 = p2->next;
} else {
p1 = p1->next;
}
head = p;
while(p1 && p2) {
if(p1->val < p2->val) {
p->next = p1;
p = p->next;
p1 = p1->next;
} else {
p->next = p2;
p = p->next;
p2 = p2->next;
}
}
while(p1) {
p->next = p1;
p = p->next;
p1 = p1->next;
}
while(p2) {
p->next = p2;
p = p->next;
p2 = p2->next;
}
return head;
}
};