Leetcode No.160 Intersection of Two Linked Lists相交链表(c++实现)

1. 题目

https://leetcode.com/problems/intersection-of-two-linked-lists/

2. 分析

我们可以将列表A和B分别分为三部分,分别为AB公共部分,交点和非公共部分,也就是

  • A = A非公共部分 + 交点 + AB公共部分
  • B = B非公共部分 + 交点 + AB公共部分

因此

  • A + B = A非公共部分 + 交点 + AB公共部分 + B非公共部分 + 交点 + AB公共部分
  • B + A = B非公共部分 + 交点 + AB公共部分 + A非公共部分 + 交点 + AB公共部分

观察A+B和B+A,我们可以发现在第二个交点之前,两者的长度必定相同,因此利用这个特点,我们可以设置两个链表指针,一个链表指针先走完A再走B,一个链表指针先走完B再走A,两者最终相遇的地方就是交点,返回第一个指针即可。

特殊情况:

  • 若A或B任意一个为空,则直接返回NULL
  • 若A,B长度一致,则链表指针不需要走完A或B即可相遇,模型也符合这种情况
  • 若A,B没有交点,则链表指针会走完A和B,最终返回NULL,模型符合该情况。
    具体代码如下:
class Solution {
 public:
     bool hasCycle(ListNode* head) {
         ListNode* faster = head;//慢指针
         ListNode* slower = head;//快指针
         while (faster != nullptr && faster->next != nullptr) {
             faster = faster->next->next;//快指针一次走两步
             slower = slower->next;//慢指针一次走一步
             if (faster == slower) {//快慢指针相遇,说明存在环
                 return true;
             }
         }
         return false;//不存在环的情形
     }
 };

参考:https://leetcode.com/problems/intersection-of-two-linked-lists/discuss/49789/My-accepted-simple-and-shortest-C%2B%2B-code-with-comments-explaining-the-algorithm.-Any-comments-or-improvements

posted @ 2021-08-11 16:31  云梦士  阅读(40)  评论(0编辑  收藏  举报