如果两个链表相交于某一节点,那么在这个相交节点之后的所有节点都是两个链表所共有的。也就是说,如果两个链表相交,那么最后一个节点肯定是共有的。先遍历第一个链表,记住最后一个节点,然后遍历第二个链表,到最后一个节点时和第一个链表的最后一个节点做比较,如果相同,则相交,否则不相交。时间复杂度为O( len1 + len2),因为只需要一个额外指针保存最后一个节点地址,空间复杂度为O(1)
// 判断链表中是否有环
bool IsExitLoop(LinkList *head)
{
LinkList *pslow = head;
LinkList *pfast = head;
while(pfast != NULL && pfast->next != NULL)
{
pslow = pslow->next; // 每次前进一步
pfast = pfast->next->next; // 每次前进二步
if(pslow == pfast) // 两个指针相遇,说明存在环
return true;
}
return false; // 没有环
}