如果两个单向链表相交,一定是形成Y字形,而不会是X字形。基于这个想法,可以判断两链表是否相交。
代码
NODE
*
FindNode(NODE
*
pHead1, NODE
*
pHead2)
{
NODE * p1 = pHead1;
NODE * p2 = pHead2;
int i = 1 , j = 1 , k = 0 , f = 0 ;
if (pHead2 == NULL || pHead2 == NULL)
{
return NULL;
}
while (p1 -> next != NULL)
{
p1 = p1 -> next;
i ++ ;
}
while (p2 -> next != NULL)
{
p2 = p2 -> next;
j ++ ;
}
if (p1 != p2)
{
return NULL; // 如果尾节点不同,直接返回NULL
}
else // 否则寻找第一个相同的节点
{
p1 = pHead1; // 1
p2 = pHead2; // 2
f = fabs(i, j); // 计算两条链表长度的差
if (i > j) // 如果第一个链表比第二个长,第一个链表先向前移动f步
{
for (k = 0 ; k < f; k ++ )
{
p1 = p1 -> next;
}
while (p1 != p2)
{
p1 = p1 -> next;
p2 = p2 -> next;
}
return p1;
}
else
{
for (k = 0 ; k < f; k ++ )
{
p2 = p2 -> next;
}
while (p1 != p2)
{
p1 = p1 -> next;
p2 = p2 -> next;
}
return p1;
}
}
}
{
NODE * p1 = pHead1;
NODE * p2 = pHead2;
int i = 1 , j = 1 , k = 0 , f = 0 ;
if (pHead2 == NULL || pHead2 == NULL)
{
return NULL;
}
while (p1 -> next != NULL)
{
p1 = p1 -> next;
i ++ ;
}
while (p2 -> next != NULL)
{
p2 = p2 -> next;
j ++ ;
}
if (p1 != p2)
{
return NULL; // 如果尾节点不同,直接返回NULL
}
else // 否则寻找第一个相同的节点
{
p1 = pHead1; // 1
p2 = pHead2; // 2
f = fabs(i, j); // 计算两条链表长度的差
if (i > j) // 如果第一个链表比第二个长,第一个链表先向前移动f步
{
for (k = 0 ; k < f; k ++ )
{
p1 = p1 -> next;
}
while (p1 != p2)
{
p1 = p1 -> next;
p2 = p2 -> next;
}
return p1;
}
else
{
for (k = 0 ; k < f; k ++ )
{
p2 = p2 -> next;
}
while (p1 != p2)
{
p1 = p1 -> next;
p2 = p2 -> next;
}
return p1;
}
}
}