Leetcode - 142 - Linked List Cycle II
Given 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. Note that pos
is not passed as a parameter.
Notice that you should not modify the linked list.
Solutions: Fast and Slow Pointers
The core of the problem is to find that
distance(the meeting point, the first node of the cycle) = distance( the first node of the list, the first node of the cycle).
It can be proved by:
x3 = x1 meas two pointers start from 'start' and 'meet' seperately with the same spped can meet at 'cycle'.
C++:
ListNode *detectCycle(ListNode *head) {
if (head == NULL || head->next == NULL) return NULL;
ListNode* firstp = head;
ListNode* secondp = head;
bool isCycle = false;
while(firstp != NULL && secondp != NULL) {
firstp = firstp->next;
if (secondp->next == NULL) return NULL;
secondp = secondp->next->next;
if (firstp == secondp) { isCycle = true; break; }
}
if(!isCycle) return NULL;
firstp = head;
while( firstp != secondp) {
firstp = firstp->next;
secondp = secondp->next;
}
return firstp;
}
// https://leetcode.com/problems/linked-list-cycle-ii/discuss/44793/O(n)-solution-by-using-two-pointers-without-change-anything
ListNode *detectCycle(ListNode *head) {
if (head == NULL || head->next == NULL)
return NULL;
ListNode *slow = head;
ListNode *fast = head;
ListNode *entry = head;
while (fast->next && fast->next->next) {
slow = slow->next;
fast = fast->next->next;
if (slow == fast) { // there is a cycle
while(slow != entry) { // found the entry location
slow = slow->next;
entry = entry->next;
}
return entry;
}
}
return NULL; // there has no cycle
}
// https://leetcode.com/problems/linked-list-cycle-ii/discuss/44781/Concise-O(n)-solution-by-using-C%2B%2B-with-Detailed-Alogrithm-Description
Java:
public ListNode detectCycle(ListNode head) {
if (head == null || head.next == null) return null;
ListNode slow = head, fast = head, start = head;
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
if (slow == fast) {
while (slow != start) {
slow = slow.next;
start = start.next;
}
return start;
}
}
return null;
}
// by annieqt https://leetcode.com/problems/linked-list-cycle-ii/discuss/44793/O(n)-solution-by-using-two-pointers-without-change-anything
Python:
lass Solution:
# @param head, a ListNode
# @return a list node
def detectCycle(self, head):
try:
fast = head.next
slow = head
while fast is not slow:
fast = fast.next.next
slow = slow.next
except:
# if there is an exception, we reach the end and there is no cycle
return None
# since fast starts at head.next, we need to move slow one step forward
slow = slow.next
while head is not slow:
head = head.next
slow = slow.next
return head
# https://leetcode.com/problems/linked-list-cycle-ii/discuss/44783/Share-my-python-solution-with-detailed-explanation
class Solution:
# @param head, a ListNode
# @return a list node
def detectCycle(self, head):
if head == None: return None
hare, turtle= head, head
while hare != None:
turtle = turtle.next
hare = hare.next
if hare == None: return None
hare = hare.next
if hare == turtle:
turtle = head
while turtle != hare:
hare = hare.next
turtle = turtle.next
return hare
return None
# https://leetcode.com/problems/linked-list-cycle-ii/discuss/44793/O(n)-solution-by-using-two-pointers-without-change-anything
上一篇: 【Leetcode第二周】两数之和(TwoSum)
下一篇: 如何进行特征选择
推荐阅读
-
Leetcode - 142 - Linked List Cycle II
-
【List-easy】141. Linked List Cycle 判断链表是否有环
-
LeetCode141. 环形链表&&142. 环形链表 II
-
LeetCode编程题——linked-list-cycle(判断单链表是否带环)
-
leetcode 203. Remove Linked List Elements
-
LeetCode 203. Remove Linked List Elements
-
Leetcode 203. Remove Linked List Elements
-
【leetcode】203. Remove Linked List Elements
-
LeetCode笔记:237. Delete Node in a Linked List
-
LeetCode 237. Delete Node in a Linked List