Sort a linked list in O(n log n) time using constant space complexity.
nlogn的排序有快速排序、归并排序、堆排序。双向链表用快排比较适合,堆排序也可以用于链表,单向链表适合用归并排序。以下是用归并排序的代码:每次找到中点,然后对于左右进行递归
/**
* 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 == nullptr || head->next == nullptr)
return head;
ListNode* fast = head;
ListNode* slow = head;
while(fast->next != nullptr && fast->next->next != nullptr) {
slow = slow->next;
fast = fast->next->next;
}
fast = slow;
slow = slow->next;
fast->next = nullptr;
fast = sortList(head);
slow = sortList(slow);
return merge(fast,slow);
}
ListNode* merge(ListNode* head1,ListNode* head2) {
if(head1 == nullptr)
return head2;
if(head2 == nullptr)
return head1;
ListNode* helper = new ListNode(0);
ListNode* last = helper;
while(head1 != nullptr && head2 != nullptr) {
if(head1->val<=head2->val) {
last->next = head1;
head1 = head1->next;
} else {
last->next = head2;
head2 = head2->next;
}
last = last->next;
}
if(head1 != nullptr)
last->next = head1;
else if(head2 != nullptr)
last->next = head2;
return helper->next;
}
};