【正确答案】
【答案解析】单链表相交是指两个链表存在完全重合的部分(注意,不是交叉到一个点)。判断两个单链表是否交叉,一般有两种方法:
1)将这两个链表首尾相连,然后检测看这个链表是否存在环,如果存在,则两个链表相交,而检测出来的依赖环入口即为相交的第一个点。
2)利用链表相交的性质,如果两个链表相交,那么两个链表从相交点到链表结束都是相同的结点,必然是Y字形,所以判断两个链表的最后一个结点是不是相同即可。即先遍历一个链表,直到尾部,再遍历另外一个链表,如果也可以走到同样的结尾点,则两个链表相交,这时记下两个链表的长度length,再遍历一次,长链表结点先出发前进(lengthMax-lengthMin)步,之后两个链表同时前进,每次一步,相遇的第一点即为两个链表相交的第一个点。
程序代码实现如下:
bool IsIntersect(Node* list1,Node* list2,Node*& value)
{
value=NULL;
if(list1==NULL‖list2==NULL)
return false;
Node *temp1=list1,*temp2=list2;
int size1=0,size2=0;
while(temp1->next)
{
temp1=temp1->next;
++size1;
}
while(temp2->next)
{
temp2=temp2->next;
++size2;
}
if(temp1==temp2)
{
if(size1>size2)
while(size1-size2>0)
{
list1=list1->next;
--size1;
}
if(size2>size1)
while(size2-size1>0)
{
list2=list2->next;
--size2;
}
while(list1!=list2)
{
list1=list1->next;
list2=list2->next;
}
value=list1;
return true;
}
else
return false;
}