判断链表相交,若相交,求交点。(假设链表可能带环)

首先我们分析,两个链表是否相交,是否带环,有以下几种情况:

在这里插入图片描述

求两个链表是否带环可以分成三个情况:
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;
 }
}

猜你喜欢

转载自blog.csdn.net/qq_40550018/article/details/82777991