我感觉这有错,大家来看看.

caoyun 2003-08-21 09:14:09
我正在学数据结构,看到这样一道题:
设 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;
}
...全文
78 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
DDrddr 2003-08-22
  • 打赏
  • 举报
回复
同意 小干
skywater 2003-08-22
  • 打赏
  • 举报
回复
分太少了,提不起兴趣去读这么一大片东西。帮你up。
cdxiaogan 2003-08-21
  • 打赏
  • 举报
回复
书上答案确实是错的
可能是编者昏头了,很小的错误
只要把原来有"<="的地方改成">",原来">"的地方改成"<="就行了
也就是把所有的"<="和">"换一下(共两处)即可

不过像你那样改的话,无论是语法上还是算法上
都存在不少错误
楼主先把本题的算法思想理解清楚再说吧
caoyun 2003-08-21
  • 打赏
  • 举报
回复
我再顶`~~~~HOHO~~~~`
caoyun 2003-08-21
  • 打赏
  • 举报
回复
晕,大虾们帮帮看看呀,我自己顶`~~~~~呵呵`~~~

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧