首先我们分析,两个链表是否相交,是否带环,有以下几种情况:
求两个链表是否带环可以分成三个情况:
1.都不带环,可以转换成两个链表是否相交的问题。
2.一个带环,一个不带环。–>不相交
3.都带环:
分别求环的入口点
1.入口点相同–>一定相交在环外
2.入口点不同
分别求环的长度
1.长度不相等–>两个链表不相交
2.长度相等
一个在它的环入口点等着,另一个从他的环入口点出发,在长度内是否相遇,如果相遇–>相交在环内,不相遇–>不相交。
代码:
Node *CircleMeetNode(Node *list1, Node *list2) { Node *m1=IsCircleList(list1);//若带环,返回相遇点 Node *m2 = IsCircleList(list2); Node *p1 = EnterNode(list1);//返回环的入口点 Node *p2 = EnterNode(list2); Node *entryNext1 = p1->next;//保存入口点的next,为恢复环做准备 Node *entryNext2 = p2->next; Node *meet = NULL; Node *cur = m1->next;
if (m1 == NULL && m2 == NULL)
{//两个都不带环,转换为两个链表相交问题
return Crossing(list1, list2);
}
else if (m1&&m2)//两个都带环,分三种情况
{
while (cur != m1 && cur != m2)//1.两个不相交
{
cur = cur->next;
}
if (cur == m1)
{
return NULL;
}
else
{
if (p1 == p2)//2.入口点相等,相交在环外
{
p1->next = NULL;//断开环转化成Y型求交点问题
p2->next = NULL;
meet=Crossing(list1, list2);
p1->next = entryNext1;//恢复环
p2->next = entryNext2;
return meet;
}
else//?
{//3.入口点不相等
return p2;
} }
}
else//一个带环,一个不带环
{
return NULL;
}
}