A linked list has no index, so finding the middle seems to need one pass to count and a second to walk halfway. Slow and fast pointers find it in a single pass: when fast reaches the end, slow is at the middle. Use it whenever you need to split a list in half, as in merge sort on lists or checking a palindrome list. Be clear which middle the problem wants for even lengths, because the loop condition decides that.