leetcode--LinkedListCycleII

来源:互联网 发布:手机能不能做淘宝客服 编辑:程序博客网 时间:2024/06/04 00:46

思路:

1.从head开始利快慢指针分别向后遍历,快指针每次比慢指针多走一步,直到快指针和慢指针相遇。

2.创建一个新的慢指slow2针指向head,和之前的慢指针同时向后遍历,直到两个慢指针相遇,返回当前相遇的节点。

证明:

设head到达环入口start需要m步,遍历一遍环需要n步。当慢指针slow到达环入口走了m步,快指针fast比slow多走m步,赶上slow需要n-m%n步。当fast和slow相遇时slow从环入口走了n-m%n步,此时如果再走m步即n+m-m%n=n+an+r-r=bn为n的整数倍,正好停在换入口处。

public ListNode detectCycle(ListNode head) {        ListNode fast=head;        ListNode slow=head;        boolean first=true;        boolean hasCycle=false;        while(fast!=null){            if(fast.next==null)break;            if(fast.equals(slow)&&!first){                hasCycle=true;                break;            }            fast=fast.next.next;            slow=slow.next;            first=false;        }        if(!hasCycle)return null;        ListNode slow2=head;        while(!slow2.equals(slow)){            slow2=slow2.next;            slow=slow.next;        }        return slow;    }


0 0
原创粉丝点击