我感觉这有错,大家来看看.
我正在学数据结构,看到这样一道题:
设 A和B是两个单链表,其表中元素递增有序。试写一算法将A和B归并成一个按元素值递减有序的单链表C,并要求辅助空间为O(1),请分析算法的时间复杂度。
书上给出的答案是这样的:
LinkList MergeSort ( LinkList A , LinkList B )
{// 归并两个带头结点的递增有序表为一个带头结点递减有序表
ListNode *pa , *pb , *q , *C ;
pa=A->next;//pa指向A表开始结点
C=A;C->next=NULL;//取A表的表头建立空的C表
pb=B->next;//pb指向B表开始结点
free(B);//回收B表的头结点空间
while ( pa && pb)
{
if ( pb->data <= pa->data )
{ // 当B中的元素小于等于A中当前元素时,将pa表的开始结点摘下
q=pa;pa=pa->next;
}
else
{// 当B中的元素大于A中当前元素时,将pb表的开始结点摘下
q=pb;pb=pb->next;}
q->next=C->next;C->next=q;//将摘下的结点q作为开始结点插入C表
}
//若pa表非空,则处理pa表
while(pa){
q=pa;pa=pa->next;
q->next=C->next;C->next=q;}
//若pb表非空,则处理pb表
while(pb){
q=pb;pa=pb->next;
q->next=C->next;C->next=q;}
return(C);
}
我感觉while(pa)到最后这段程序有错
按这个算法,一开始比较两个连表的头结点的大小,比方两个链表存放的数据是这样的{1,3,5,7}和{2,4,6,8}。首先的pa->data=1,pb->data=2,则
pb->data<pb->data,那么把pb放在新链表C的链首,如此因为A,B都是增序链表,则以后的pb->data一定大于pa->data;那么最后的pa还是没动过,然而,程序的
while(pa)和while(pb)的程序段是把pa的剩下结点依次放在C的链首,但是正如我举的例子看,1比2小,放在2的后面(C是倒序),而3应该放在2的前面,好象和这个程序本身不符合吧。大家都帮我看看,谢谢了。
我自己写了一个,大家看看对不对:
LinkList MergeSort(LinkList A ,LinkList B)
{
ListNode *pa,*pb,*p,*q,*C;
pa=A->next;
pb=B->next;
C=A;
C->next=NULL;
free(B);
while(pa&&pb)
{
if(pa->data>=pb->data)
{
p=pa;
pa=pa->next;
}
else{
p=pb;
pb=pb->next;
}
p->next=C->next;
C->next=p;
}//到这和上面的没有区别;
while(pa)
{
q=c;
while(q->next>=pa->data&&q->next->next)//找到比pa->data大的最后一结点
q=q->next;
if(q->next->next==NULL)//如果上面的循环退出的条件是没有找到这样的结点
{
p=pa;
pa=pa->next;
q=p;
q->next=NULL;
}
else{
p=pa;
pa=pa->next;
q->next=p;
}
}
while(pb)
{
q=C;
while(q->next->data>=pb->data&&q->next->next)
q=q->next;
if(q->next->next==NULL)
{
p=pb;
pb=pb->next;
q->next->next=p;
q=p;
q->next=NULL;
}
else{
p=pb;
pb=pb->next;
p-next=q->next;
q->next=p;
}
}
return C;
}