Here's a rough sketch of a proof:

Assume that we have a list with transient(non-looping part) of length T>=0 and period(looping part) of length P>1. Send two pointers down the list. One will advance j1 nodes at a time, the other will advance j2!=j1 nodes at a time. So, at some smallest time t0, both pointers will be in the loop, if there is one. The position of a pointer at t0 will depend on T and j. For the moment lets just call the positions of our pointers at t0, x1 and x2. So, the positions of the pointers in the loop are given by:

(j1*t+x1) mod P and (j2*t+x2) mod P

For this technique to work, we need the positions to be equal at some time t>t0. So,

(j1*t+x1) = (j2*t+x2) mod P =>

(j1*t - j2*t + x1 - x2) = 0 mod P =>

((j1-j2)t+(x1-x2))/P = n for some integer n>0 =>

t = nP/(j1-j2) + (x1-x2)/(j1-j2).

So, if j1=2 and j2=1, as above, t is obviously an integer for any P and T, which was what we wanted.