First, detect if a cycle exists using the two-pointer technique. If fast catches slow, there is a cycle. This phase runs until they meet or fast hits null. Second, find where the cycle starts by resetting one pointer and moving both one step at a time.
This phase runs until they meet again. Separating these phases makes the algorithm clear. Each phase has a single goal. You do not mix detection logic with location logic, which would make the code harder to understand.