notice:此题可能有多个环,要找出的是第一个环的入口点

链表中环的入口结点

http://www.nowcoder.com/questionTerminal/253d2c59ec3e4bc68da16833f79a38e4

解法2

1. 若有环,两指针一定会相遇。因为每走 1 轮,fast 与 slow 的间距 +1,fast 终会追上 slow;
2. 当fast == slow时, 两指针在环中 第一次相遇 。下面分析此时fast 与 slow走过的 步数关系 :
   设环中结点个数是b,则fast=2*slow, fast=slow+nb,得slow=nb
3.设head到环起点位置(不包括环起点)共有a个结点。则此时fast从head开始出发,走完a步,则必和slow指针在环起点位置相遇。     (因为相遇时slow指针走了a+nb步,刚好在环起点处)  

复杂度分析
时间:O(n)
空间:O(1)
/**

  • Definition for singly-linked list.
  • struct ListNode {
  • int val;
  • ListNode *next;
  • ListNode(int x) : val(x), next(NULL) {}
  • };
  • /
    class Solution {
    public:
    //注意此题有多个环
    ListNode *detectCycle(ListNode *head) {
     if(!head) return nullptr;
     ListNode* fast = head;
     ListNode* slow = head;
     while(fast->next && fast->next->next) {
         fast = fast->next->next;
         slow = slow->next;
         if (fast == slow) break;
     }
     if(!fast->next || !fast->next->next) return nullptr;
     fast = head;
     while(fast != slow) {
         fast = fast->next;
         slow = slow->next;
     }
     return slow;
    }
    };

详情可以关注我的LeetCode:

作者:wallcwr
链接:https://leetcode-cn.com/problems/linked-list-cycle-ii/solution/shuang-zhi-zhen-jian-ji-jie-fa-by-wallcwr/
来源:力扣(LeetCode)

全部评论

相关推荐

06-23 10:26
佳木斯大学 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务