问题描述: 判断两个无环单链表是否交叉
思路:一种思路是 hash法:如果交叉,一定存在相同节点,对指针做哈希。另一种思路是尾节点法:首先线性时间获得两个链表的长度L1,L2。然后各自从头开始,长链表先出发|L1 - L2| 步,之后两个链表同时前进,相遇的第一个节点即为交叉点。
LNode* IsInteract(LinkList head1, LinkList head2)
{
LNode* temp1 = head1->next;
LNode* temp2 = head2->next;
int L1 = 0, L2 = 0;
while(temp1->next)
{
temp1 = temp1->next;
L1++;
}
while(temp2->next)
{
temp2 = temp2->next;
L2++;
}
if(temp1 == temp2)
{
if(L1 > L2)
while(L1 - L2 > 0)
{
head1 = head1->next;
L1 --;
}
if(L1 < L2)
while(L2 - L1 >0)
{
head2=head2->next;
L2 --;
}
while(head1 != head2)
{
head1 = head1->next;
head2 = head2->next;
}
return head1;
}
else
return NULL;
}