### 这道题分两种情况讨论:链表是否存在环(询问面试官)。 --- #### 无环 思路:如果这两个链表相交,那么从它们的第一个相交的点开始,之后两个链表上的节点都是相同的。因此,我们只要遍历两个链表判断最后那个节点是否相同就可以了。 ``` bool isInteractNoLoop(SList *list1, SList *list2) { if (list1 == nullptr || list2 == nullptr) { return false; } SList *lastNode1 = list1, *lastNode2 = list2; // 两个 while 循环分别求出两个链表的最后一个节点 while (list1 != nullptr) { lastNode1 = list1; list1 = list1->m_next; } while (list2 != nullptr) { lastNode2 = list2; list2 = list2->m_next; } return (lastNode1 == lastNode2); } ``` #### 不知道是否有环 这种情况我们需要先[判断链表是否有环](https://www.kancloud.cn/persuez/algorithm/858057)。 1. 两个链表都没有环, 按上面无环的算法走; 2. 一个有环,一个无环,这两个链表不可能相交; 3. 两个都有环,此时两条链表如果相交,那么一定共享这个环。所以我们可以在判断链表A是否有环时返回碰撞点,然后遍历B链表查看碰撞点是否也在B中,在的话,则表示两条链表共享环,否则不共享。