题目:
给定两个非环单链表(first, second),检测两个链表是否有交点,如果有返回第一个交点。
思路:
如果first==second,那么显然相交,直接返回first。
否则,分别从first,second开始遍历两个链表获得其长度len1与len2。假设len1>len2,那么指针p1由first开始向后移动len1-len2步。
指针p2=second,下面p1、p2每次向后前进一步并比较是否相等,如果相等即返回该结点,否则说明两个链表没有交点。
代码:
Node *IsIntersect(Node *first, Node *second)
{
if(first == NULL || second == NULL)
{
return NULL;
}
Node *p1, *p2;
p1 = first;
p2 = second;
int len1 = Length_LinkList(first);
int len2 = Length_LinkList(second);
if(len1 >= len2)
{
for(int i = 0; i < len1-len2; i++)
{
p1 = p1->next;
}
}else
{
for(int i = 0; i < len2-len1; i++)
{
p2 = p2->next;
}
}
while(p1 != NULL && p2 != NULL)
{
if(p1 == p2)
{
return p1;
}
p1 = p1->next;
p2 = p2->next;
}
return NULL;
}
注:代码中所用到的计算单链表长度的Length_LinkList()函数请看“单链表基础”
扩展:考虑假设链表有环,应该怎么检测是否有交点?