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;
}