Use two pointers: slow moves step, fast moves steps. If there's a cycle, they will eventually meet.
Initialize both pointers at head.
Move slow by , fast by .
If fast reaches null, no cycle.
If slow meets fast, there's a cycle.
Why it works: in a cycle, fast gains step per iteration. If the cycle has length , they meet within iterations.