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)