如果链表可能有环,判断两个链表是否相交?

链表相交:LeetCode第 160 题:相交链表(C++)_zj-CSDN博客

环形链表:LeetCode第 141 题:环形链表(C++)_zj-CSDN博客

那如果如果链表可能有环,判断两个链表是否相交?

分两步来:

第一步:先判断两个链表是否有环,如果有环的话,找到环的入口点。

  • 判断是否有环:快慢指针法
    快慢指针p, q,快指针一次走两步,慢指针一次走一步。如果有环,两者必定相遇,否则没有环。
  • 如果有环,当p和q相遇时,q(快指针)回到起点,然后p,q同步走(一次走一步),两者再次相遇的节点就是环的入口点。

第二步:分情况讨论

首先注意:

  • 如果两个带有环的链表相交,则这两个链表的环肯定是同一个环。这一点自己画画图就明白了。
  • 如果两个单链表有共同的节点,那么从第一个共同节点开始,后面的节点都会重叠,直到链表结束。

分情况讨论:

  • 如果第一步的两个链表均无环,如果相交的话两个链表的尾节点必然相同。
  • 如果一个有环,一个无环,那么必然不相交。
  • 如果两个都有环:
    第一步的时候我们知道了两个链表的环的切入点m和n,现在再设置快慢指针slow和fast,两者均初始化为m,还是一样的慢指针一次一步,快指针一次两步。
    如果fast在遇到slow之前,出现fast = n或者fast->next = n,说明相交,n为一个交点。
    如果两个环切入点m,n不相等,那么m也为一个交点。

两个都有环不外乎三种情况:
参考:判断两个可能有环的链表是否有交点_weixin_43578004的博客-CSDN博客
1、各自成环,不相交
在这里插入图片描述2、先相交,共享一个环在这里插入图片描述
3、共享一个环,但各自入环节点不同
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_32523711/article/details/108956158