问答题
假设有两个按元素值递增次序排列的线性表,均以单链表形式存储。请编写算法将这两个单链表归并为一个按元素值递减次序排列的单链表,并要求利用原来两个单链表的结点存放归并后的单链表。【北京大学1998年】
【正确答案】正确答案:算法的基本设计思想:因为两链表已按元素值递增次序排列,将其合并时,均从第一个结点起进行比较,将较小的结点链入链表中,同时后移链表工作指针。该问题要求结果链表按元素值递减次序排列,故在合并的同时,将链表结点逆置。算法的代码: LinkList Union(LinkList la,LinkList ib){ //本算法将两链表合并成一个按元素值递减次序排列的单链表 pa=la一>next; pb=ib一>next; //pa,pb分别为链表la和ib的工作指针 la一>next=NULL; //la作结果链表的头指针,先将结果链表初始化为空 while(pa!=NULL&&pb!=NULL) //当两链表均不为空时 { if(pa->data<=pb->data、 { r=pa一>next; //将pa的后继结点暂存于r pa->next=la->next; //将pa结点链入结果表中,同时逆置 1a一>next=pa; pa=r; //恢复pa为当前待比较结点 } else { r=pb->next; //将pb的后继结点暂存于r pb一>next=la一>next; //将pb结点链入结果表中,同时逆置 la一>next=pb ; pb=r; //恢复pb为当前待比较结点 } } while(pa!=NULL) //将la表的剩余部分链入结果表中,并逆置 { r=pa一>next; pa一>next=la一>next ; la一>next=pa, Pa=r; } while(pb!=NULL) { r=pb一>next ; pb一>next=la一>next; la一>next=pb; pb=r; } retUrn |a; {//Union 上面两链表均不为空的表达式也可简写为while(pa&&pb)。两递增有序表合并成递减有序表时,本题算法是边合并边逆置。也可先合并完,再作链表逆置。后者不如前者效率高。算法中最后两个while语句,不可能执行两个,只能二者取一,即哪个表尚未到尾,就将其逆置到结果表中,即将剩余结点依次前插入到结果表的头结点后面。这一点与顺序表的合并相似,其实不论是顺序表还是链表、线性表的合并算法思路基本是一样的。所以,关键是要理解解题思路,不同的数据结构,只是表述不同。
【答案解析】