链表的排序问题,要求常数级的空间复杂度,时间复杂度为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 || head->next == NULL)
return head;
else{
ListNode *p, *q;
p=head;
q=head;
while(p->next != NULL && p->next->next != NULL){
p=p->next->next;
q=q->next;
}
ListNode *temp=q;
q=q->next;
temp->next = NULL;
ListNode *first = sortList(head);
ListNode *last = sortList(q);
return Merge(first,last);
}
}
ListNode *Merge(ListNode *head1, ListNode *head2){
if(head1==NULL)return head2;
if(head2==NULL)return head1;
ListNode *q , *p ;
if(head1->val < head2->val)
{q=head1; head1=head1->next;}
else
{q=head2; head2=head2->next;}
p=q;
while(head1!=NULL&&head2!=NULL)
{
if(head1->val<=head2->val)
{
p->next=head1;
head1=head1->next;
}
else
{
p->next=head2;
head2=head2->next;
}
p=p->next;
}
if(head1!=NULL)p->next=head1;
else if(head2!=NULL)p->next=head2;
return q;
}
};