结论:一个指针从相遇点开始走,另一个指针从起始点开始走,他们会在入口点相遇。fast走的路程:L+N*C+X。slow走的路程:L+X。 - 教程

1.判断是否是环形链表

141. 环形链表 - 力扣(LeetCode)

bool hasCycle(struct ListNode *head)
{
struct ListNode *fast,*slow;
fast=slow=head;
while(fast&&fast->next)
{
fast=fast->next->next;
slow=slow->next;
if(fast==slow)
return true;
}
return false;
}

 2.环形链表2.0

142. 环形链表 II - 力扣(LeetCode)

思考:

slow走的路程:L+X

fast走的路程:L+N*C+X

2*(L+X)=L+N*C+X

L=N*C-X

结论:一个指针从相遇点开始走,另一个指针从起始点开始走,他们会在入口点相遇

struct ListNode *detectCycle(struct ListNode *head)
{
struct ListNode *fast,*slow;
fast=slow=head;
while(fast&&fast->next)
{
fast=fast->next->next;
slow=slow->next;
if(fast==slow)
{
struct ListNode *meet=slow;
struct ListNode *start=head;
while(meet!=start)
{
start=start->next;
meet=meet->next;
}
return meet;
}
}
return NULL;
}

posted @ 2025-07-27 20:13  yfceshi  阅读(4)  评论(0)    收藏  举报