这道题和1差不多,只是让寻找开始节点
定义walker和runner并且同时指向head。
walker一次走一步,runner一次走两步,
runner为空或走到末尾则跳出循环。
如果walker和runner相遇,则存在cycle。此时跳出循环,否则返回空。
然后让walker回到head,walker和runner同时走一步,直到相遇,那个节点就是cycle的开始节点。
代码如下 public ListNode detectCycle(ListNode head) {
if(head==null)
return head;
ListNode walker=head;
ListNode runner=head;
while(runner!=null&&runner.next!=null) {
walker=walker.next;
runner=runner.next.next;
if(walker==runner)
break;
}
if(runner==null||runner.next==null)
return null;
walker=head;
while(walker!=runner) {
walker=walker.next;
runner=runner.next;
}
return runner;
}