作者:我是王美慧 | 来源:互联网 | 2023-09-14 15:03
如果两个链表无换,判断是否相交很简单,判断两个环的最后一个节点指针是否相等即可。题目描述:上面的问题都是针对链表无环的,那么如果现在,链表是有环的呢?上面的方法还同样有效么?分析:如果有
如果两个链表无换,判断是否相交很简单,判断两个环的最后一个节点指针是否相等即可。
题目描述:上面的问题都是针对链表无环的,那么如果现在,链表是有环的呢?上面的方法还同样有效么?
分析:如果有环且两个链表相交,则两个链表都有共同一个环,即环上的任意一个节点都存在于两个链表上。因此,就可以判断一链表上俩指针相遇的那个节点,在不在另一条链表上。
- 无环链表和有环链表是不可能相交的;
- 两个有环链表若相交,其“整个环上”的所有node一定都重合;
- 有环链表的相交,情况只有2种:相交于”环上”或相交于”不是环的部分”,即下图所示;
//判断单链表是否存在环,参数circleNode是环内节点,后面的题目会用到
bool hasCircle(Node *head,Node *&circleNode)
{
Node *slow,*fast;
slow = fast = head;
while(fast != NULL && fast->next != NULL)
{
fast = fast->next->next;
slow = slow->next;
if(fast == slow)
{
circleNode = fast;
return true;
}
}
return false;
}
//判断两个带环链表是否相交bool isIntersectWithLoop(Node *h1,Node *h2){ Node *circleNode1,*circleNode2; if(!hasCircle(h1,circleNode1)) //判断链表带不带环,并保存环内节点 return false; //不带环,异常退出 if(!hasCircle(h2,circleNode2)) return false; Node *temp = circleNode2->next; while(temp != circleNode2) { if(temp == circleNode1) return true; temp = temp->next; } return false;}
参考:http://wuchong.me/blog/2014/03/25/interview-link-questions/