要求:对一个单链表进行排序,时间复杂度为(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 == NULL)
return NULL;
ListNode *end = head;
while(end->next != NULL)
end = end->next;
sort(head, end);
return head;
}
void sort(ListNode* &left, ListNode* &right)
{
if(left == right)
return;
//寻找中间位置
ListNode *p1, *p2;
p1 = p2 = left;
while(p2 != right && p2->next != right)
{
p1 = p1->next;
p2 = p2->next->next;
}
p2 = p1->next;
//递归分治
sort(left, p1);
sort(p2, right);
p1->next = NULL;
right->next = NULL;
sorted_merge(left, p1, p2, right);
}
//归并
void sorted_merge(ListNode *&head1, ListNode *&end1, ListNode *&head2, ListNode *&end2)
{
ListNode *new_start,*new_end, *tmp;
if(head1->val < head2->val)
{
new_start = head1;
head1 = head1->next;
}
else
{
new_start = head2;
head2 = head2->next;
}
tmp = new_start;
while(head1 != NULL && head2 != NULL)
{
if(head1->val < head2->val)
{
tmp->next = head1;
tmp = head1;
head1 = head1->next;
}
else
{
tmp->next = head2;
tmp = head2;
head2 = head2->next;
}
}
if(head1 != NULL)
{
tmp->next = head1;
new_end = end1;
}
else
{
tmp->next = head2;
new_end = end2;
}
//返回新链表头和链表尾
head1 = new_start;
end2 = new_end;
end2->next = NULL;
}
};