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

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

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值