http://blog.csdn.net/hackbuteer1/article/details/8016173
101、实现一个队链表排序的算法,C/C++可以使用std::list<int>,Java使用LinkedList<Integer>
要求先描述算法,然后再实现,算法效率尽可能高效。
主要考察链表的归并排序。
要点:需要使用快、慢指针的方法,找到链表的的中间节点,然后进行二路归并排序
typedef struct LNode
{
int data;
struct LNode* next;
}LNode,*LinkList;
LinkList MergeList_1(LinkList head1,LinkList head2)
{
LinkList head,result=NULL;
if(head1==NULL)
return head2;
if(head2==NULL)
return head1;
while(head1&&head2)
{
if(head1->data<head2->data)
{
if(result==NULL)
{
head=result=head1;
head1=head1->next;
}
else
{
result->next=head1;
result=head1;
head1=head1->next;
}
}
else
{
if(result==NULL)
{
head=result=head2;
head2=head2->next;
}
else
{
result->next=head2;
result=head2;
head2=head2->next;
}
}
}
if(head1)
result->next=head1;
if(head2)
result->next=head2;
return head;
}
LinkList MergeList(LinkList head1,LinkList head2)
{
LinkList result;
if(head1==NULL)
return head2;
if(head2==NULL)
return head1;
if(head1->data<head2->data)
{
result=head1;
result->next=MergeList(head1->next,head2);
}
else
{
result=head2;
result->next=MergeList(head1,head2->next);
}
return result;
}
LinkList MergeSort(LinkList head)
{
if(head==NULL)
return NULL;
LinkList r_head,slow,fast;
r_head=slow=fast=head;
while(fast->next!=NULL&&fast->next->next!=NULL)
{
slow=slow->next;
fast=fast->next->next;
}
if(slow->next==NULL)//链表中只有一个节点
return r_head;
fast=slow->next;
slow->next=NULL;
slow=head;
LinkList p=MergeSort(slow);
LinkList q=MergeSort(fast);
r_head=MergeList(p,q);
return r_head;
}
void CreateList(LinkList& head)
{
int sum;
cin>>sum;
head=(LinkList)malloc(sizeof(LNode));
head->data=12;
head->next=NULL;
for(int i=0;i<sum;i++)
{
LinkList p=(LinkList)malloc(sizeof(LNode));
p->next=NULL;
int j;
cin>>j;
p->data=j;
p->next=head->next;
head->next=p;
}
}
void Traverse(LinkList head)
{
while(head)
{
cout<<head->data<<" ";
head=head->next;
}
cout<<endl;
}
int main()
{
LinkList head=NULL;
CreateList(head);
head=MergeSort(head);
cout<<endl;
Traverse(head);
cout<<endl;
return 0;
}