Given a singly linked list, write an efficient algorithm to detect a cycle and find the starting node of the cycle.