问题 问答题

已知L1、L2分别为两循环单链表的头结点指针,m,n分别为L1、L2表中数据结点个数。要求设计一算法,用最快速度将两表合并成一个带头结点的循环单链表。

答案

参考答案:循环单链表L1和L2数据结点个数分别为m和n,将二者合成一个循环单链表时,需要将一个循环链表的结点(从第一元素结点到最后一个结点)插入到另一循环链表的第一元素结点前即可。题目要求“用最快速度将两表合并”,因此应找结点个数少的链表查其尾结点。
LinkedList Union(LinkedList L1,L2;int m,n)
∥L1和L2分别是两循环单链表的头结点的指针,m和n分别是L1和L2的长度。
∥本算法用最快速度将L1和L2合并成一个循环单链表。
{
if(m<0 ‖ n<O)
{
printf(“表长输入错误\n”);
exit(0);
}
if(m<n)∥若m<n,则查L1循环单链表的最后一个结点
{
if(m==0)
return(L2);∥L1为空表
else
{
p=L1:
while(p—>next!—L1)
p=p—>next;∥查最后一个元素结点
p—>next=L2—>next;
∥将L1循环单链表的元素结点插入到L2的第一元素结点前
L2—>next—L1—>next;
free(L1);∥释放无用头结点
}
}∥处理完m<n情况
else∥下面处理L2长度小于等于L1的情况
{
if(n==0)
return(L1);∥L2为空表
else
p—L2;
while(p—>next!—L2)
p—p—>next;∥查最后元素结点
P—>next—L1—>next;
∥将L2的元素结点插入到L1循环单链表的第一元素结点前
L1—>next—L2—>next;
free(L2);∥释放无用头结点
}
}

判断题
单项选择题