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

时间:2021-08-11
本文章向大家介绍Leetcode No.160 Intersection of Two Linked Lists相交链表(c++实现),主要包括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

作者:云梦士
本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。

原文地址:https://www.cnblogs.com/yunmeng-shi/p/15128892.html