142.Linked List Cycle II
===
###### tags: `Medium`,`Linked List`,`Two Pointers`,`Hash Table`
[142. Linked List Cycle II](https://leetcode.com/problems/linked-list-cycle-ii/)
### 題目描述
Given the `head` of a linked list, return *the node where the cycle begins. If there is no cycle, return* `null`.
There is a cycle in a linked list if there is some node in the list that can be reached again by continuously following the `next` pointer. Internally, `pos` is used to denote the index of the node that tail's `next` pointer is connected to (**0-indexed**). It is `-1` if there is no cycle. **Note that** `pos` **is not passed as a parameter**.
**Do not modify** the linked list.
### 範例
**Example 1:**
![](https://assets.leetcode.com/uploads/2018/12/07/circularlinkedlist.png)
```
Input: head = [3,2,0,-4], pos = 1
Output: tail connects to node index 1
Explanation: There is a cycle in the linked list, where tail connects to the second node.
```
**Example 2:**
![](https://assets.leetcode.com/uploads/2018/12/07/circularlinkedlist_test2.png)
```
Input: head = [1,2], pos = 0
Output: tail connects to node index 0
Explanation: There is a cycle in the linked list, where tail connects to the first node.
```
**Example 3:**
![](https://assets.leetcode.com/uploads/2018/12/07/circularlinkedlist_test3.png)
```
Input: head = [1], pos = -1
Output: no cycle
Explanation: There is no cycle in the linked list.
```
**Constraints**:
* The number of the nodes in the list is in the range [0, 10^4^].
* -10^5^ <= `Node.val` <= 10^5^
* `pos` is `-1` or a **valid index** in the linked-list.
**Follow up:** Can you solve it using O(1) (i.e. constant) memory?
### 解答
#### Python
```python=
class Solution:
def detectCycle(self, head: Optional[ListNode]) -> Optional[ListNode]:
if not head:
return
def getIntersect(head):
slow, fast = head, head
while fast and fast.next:
slow = slow.next
fast = fast.next.next
if slow == fast:
return slow
return
intersect = getIntersect(head)
if not intersect:
return
ptr1, ptr2 = head, intersect
while ptr1 != ptr2:
ptr1 = ptr1.next
ptr2 = ptr2.next
return ptr1
```
>[name=Ron Chen][time=Thr, Mar 9, 2023]
```python=
class Solution:
def detectCycle(self, head: Optional[ListNode]) -> Optional[ListNode]:
fast = slow = head
while fast and fast.next:
fast = fast.next.next
slow = slow.next
if fast == slow:
while head != slow:
head = head.next
slow = slow.next
return head
return None
```
> [name=Yen-Chi Chen][time=Thu, Mar 9, 2023]
#### C++
```cpp=
class Solution {
public:
ListNode *detectCycle(ListNode *head) {
auto fast = head, slow = head;
while (fast && fast->next) {
fast = fast->next->next;
slow = slow->next;
if (fast == slow) {
while (head != slow) {
head = head->next;
slow = slow->next;
}
return head;
}
}
return NULL;
}
};
```
> [name=Yen-Chi Chen][time=Thu, Mar 9, 2023]
#### Javascript
```javascript=
function detectCycle(head) {
if (head === null) return null;
let tortoise = head;
let hare = head;
do {
if (hare.next === null || hare.next.next === null) return null;
tortoise = tortoise.next;
hare = hare.next.next;
} while (tortoise !== hare);
hare = head;
while (tortoise !== hare) {
hare = hare.next;
tortoise = tortoise.next;
}
return hare;
}
```
> [name=Marsgoat][time=Thu, Mar 9, 2023]
### Reference
先從這題做起
https://leetcode.com/problems/linked-list-cycle/
[回到題目列表](https://hackmd.io/@Marsgoat/leetcode_every_day)