题目大意:用o(nlgn)时间复杂度和固定额外空间对链表进行排序
其实就是进行归并排序。遍历一遍链表生成数个子链表,每个子链表都是已排序的。然后各子链表归并
我查找所使用的子链表序列是顺序查找,其实可以考虑更优的办法,如堆排序先什么的。。。
但可以肯定的是面试官不会高兴顺序查找的,在面试的时候就不能透露出顺序查找的念头,哈哈宁愿说我没有好方法
下面是AC的代码
class Solution {
public:
ListNode* heads;
int lines;
Solution()
{
heads=(struct ListNode *)malloc(sizeof(ListNode)*10000);
}
int mix()
{
int i=1;
int pt=0;
ListNode* ret=NULL;
for(i;i<=lines;i++)
{
if(heads[i].next!=NULL)
{
if(pt==0)
{
pt=i;
}else
{
if(heads[i].next->val<heads[pt].next->val)
{
pt=i;
}
}
};
};
return pt;
}
ListNode *sortList(ListNode *head) {
lines=0;
int i;
ListNode* flag=head;
ListNode* buf=NULL;
int pt;
while(flag)
{
if(lines==0)
{
heads[1].next=flag;
flag=flag->next;
heads[1].next->next=NULL;
lines=1;
}else
{
for(i=1;i<=lines;i++)
{
if(heads[i].next->val >=flag->val)
{
buf=flag->next;
flag->next=heads[i].next;
heads[i].next=flag;
flag=buf;
break;
}
};
if(i>lines)
{
lines++;
heads[lines].next=flag;
flag=flag->next;
heads[lines].next->next=NULL;
}
}
};
flag=NULL;
do
{
pt=mix();
if(flag==NULL && pt>0)
{
flag=heads[pt].next;
head=flag;
if(pt!=0)
{
heads[pt].next=heads[pt].next->next;
}
flag->next=NULL;
}else if(pt>0)
{
flag->next=heads[pt].next;
heads[pt].next=heads[pt].next->next;
flag=flag->next;
flag->next=NULL;
}
}while(pt>0);
return head;
}
};