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 j_{1} nodes at a time, the other will advance j_{2}!=j_{1} nodes at a time. So, at some smallest time t_{0}, both pointers will be in the loop, if there is one. The position of a pointer at t_{0} will depend on T and j. For the moment lets just call the positions of our pointers at t_{0}, x_{1} and x_{2}. So, the positions of the pointers in the loop are given by:

(j_{1}*t+x_{1}) mod P and (j_{2}*t+x_{2}) mod P

For this technique to work, we need the positions to be equal at some time t>t_{0}. So,

(j_{1}*t+x_{1}) = (j_{2}*t+x_{2}) mod P =>

(j_{1}*t - j_{2}*t + x_{1} - x_{2}) = 0 mod P =>

((j_{1}-j_{2})t+(x_{1}-x_{2}))/P = n for some integer n>0 =>

t = nP/(j_{1}-j_{2}) + (x_{1}-x_{2})/(j_{1}-j_{2}).

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