题目
代码(首刷看解析)
class Solution {
public:
ListNode *detectCycle(ListNode *head) {
auto fast = head, slow = head;
while(fast && fast->next) {
slow = slow->next;
fast = fast->next->next;
if(slow == fast)
break;
}
if(!fast || !fast->next)
return nullptr;
slow = head;
while(slow != fast) {
slow = slow->next;
fast = fast->next;
}
return slow;
}
};
代码(7.30 二刷自解)
class Solution {
public:
ListNode *detectCycle(ListNode *head) {
auto fast = head;
auto slow = head;
if(!fast || !fast->next)
return nullptr;
do {
if(!fast || !fast->next)
return nullptr;
fast = fast->next->next;
slow = slow->next;
}while(fast != slow);
slow = head;
while(slow != fast) {
slow = slow->next;
fast = fast->next;
}
return slow;
}
};
代码(8.8 三刷自解)
class Solution {
public:
ListNode* EntryNodeOfLoop(ListNode* pHead) {
auto fast = pHead, slow = pHead;
while(fast && fast->next) {
fast = fast->next->next;
slow = slow->next;
if(fast == slow)
break;
}
if(!fast || !fast->next)
return nullptr;
slow = pHead;
while(fast != slow) {
fast = fast->next;
slow = slow->next;
}
return fast;
}
};
GO
func detectCycle(head *ListNode) *ListNode {
fast, slow := head, head
for fast != nil && fast.Next != nil {
fast = fast.Next.Next
slow = slow.Next
if fast == slow {
break
}
}
if fast == nil || fast.Next == nil {
return nil
}
slow = head
for fast != slow {
slow = slow.Next
fast = fast.Next
}
return fast
}
代码(9.7 四刷自解)
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)
break;
}
if(!fast || !fast->next)
return nullptr;
fast = head;
while(fast != slow) {
fast = fast->next;
slow = slow->next;
}
return fast;
}
};