<p style="margin:10px auto; padding-top:0px; padding-bottom:0px">原文引用地址:http://www.cnblogs.com/springfor/p/3862125.html</p>
<p style="margin:10px auto; padding-top:0px; padding-bottom:0px">Given a linked list, return the node where the cycle begins. If there is no cycle, return <code style="margin:0px; padding:0px">null</code>.</p>
<p style="margin:10px auto; padding-top:0px; padding-bottom:0px">Follow up:<br style="margin:0px; padding:0px"> Can you solve it without using extra space?</p>
<p style="margin:10px auto; padding-top:0px; padding-bottom:0px"> </p>
<p style="margin:10px auto; padding-top:0px; padding-bottom:0px"><span style="margin:0px; padding:0px">题解</span>: <br style="margin:0px; padding:0px"> </p>
<p style="margin:10px auto; padding-top:0px; padding-bottom:0px">这个连同I都是很经典的题啦,刷CC150时候就折磨了半天。</p>
<p style="margin:10px auto; padding-top:0px; padding-bottom:0px">其实就推几个递推公式就好。。首先看图(图引用自CC150):<br style="margin:0px; padding:0px"> </p>
<p style="margin:10px auto; padding-top:0px; padding-bottom:0px"><img alt="" height="233" src="https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-553167daca8542bed3297ffa7044d42f.png" style="margin:0px; padding:0px; border:0px; max-width:660px" width="471"> <br style="margin:0px; padding:0px"> </p>
<p style="margin:10px auto; padding-top:0px; padding-bottom:0px">从链表起始处到环入口长度为:a,从环入口到Faster和Slower相遇点长度为:x,整个环长为:c。</p>
<p style="margin:10px auto; padding-top:0px; padding-bottom:0px">明确了以上信息,就可以开始做运算了。。</p>
<p style="margin:10px auto; padding-top:0px; padding-bottom:0px"> </p>
<p style="margin:10px auto; padding-top:0px; padding-bottom:0px"> 假设从开始到相遇,Slower走过的路程长为s,由于Faster的步速是Slower的2倍,那么Faster在这段时间走的路程长为2s。<br style="margin:0px; padding:0px"> </p>
<p style="margin:10px auto; padding-top:0px; padding-bottom:0px"> 而对于Faster来说,他走的路程还等于之前绕整个环跑的n圈的路程nc,加上最后这一次遇见Slower的路程s。</p>
<p style="margin:10px auto; padding-top:0px; padding-bottom:0px"> 所以我们有:</p>
<p style="margin:10px auto; padding-top:0px; padding-bottom:0px"> 2s = nc + s <br style="margin:0px; padding:0px"> </p>
<p style="margin:10px auto; padding-top:0px; padding-bottom:0px"> 对于Slower来说,他走的路程长度s还等于他从链表起始处到相遇点的距离,所以有:<br style="margin:0px; padding:0px"> </p>
<p style="margin:10px auto; padding-top:0px; padding-bottom:0px"> s = a + x </p>
<p style="margin:10px auto; padding-top:0px; padding-bottom:0px"> 通过以上两个式子代入化简有:</p>
<p style="margin:10px auto; padding-top:0px; padding-bottom:0px"> a + x = nc</p>
<p style="margin:10px auto; padding-top:0px; padding-bottom:0px"> a = nc - x</p>
<p style="margin:10px auto; padding-top:0px; padding-bottom:0px"> a = (n-1)c + c-x</p>
<p style="margin:10px auto; padding-top:0px; padding-bottom:0px"> a = kc + (c-x)</p>
<p style="margin:10px auto; padding-top:0px; padding-bottom:0px">那么可以看出,c-x,就是从相遇点继续走回到环入口的距离。上面整个式子可以看出,如果此时有个pointer1从起始点出发并且同时还有个pointer2从相遇点出发继续往前走(都只迈一步),那么绕过k圈以后, pointer2会和pointer1在环入口相遇。这样,换入口就找到了。<br style="margin:0px; padding:0px"> </p>
<p style="margin:10px auto; padding-top:0px; padding-bottom:0px">Reference: http://blog.csdn.net/xiaxia__/article/details/19356861 <br style="margin:0px; padding:0px"> </p>
<p style="margin:10px auto; padding-top:0px; padding-bottom:0px"> <br style="margin:0px; padding:0px"> </p>
<p style="margin:10px auto; padding-top:0px; padding-bottom:0px">代码如下:</p>
<div class="cnblogs_code" style="margin:5px 0px; padding:5px; background-color:rgb(245,245,245); border:1px solid rgb(204,204,204); overflow:auto; font-family:"Courier New"!important">
<div class="cnblogs_code_toolbar" style="margin:5px 0px 0px; padding:0px">
<span class="cnblogs_code_copy" style="margin:0px; padding:0px 5px 0px 0px; line-height:1.5!important"><a style="margin:0px; padding:0px; border:none!important" target="_blank" title="复制代码"><img alt="复制代码" src="https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-69c5a8ac3fa60e0848d784a6dd461da6.gif" style="margin:0px; padding:0px; max-width:660px; border:none!important"></a></span>
</div>
<div style="margin:0px; padding:0px">
<span style="margin:0px; padding:0px; color:rgb(0,128,128); line-height:1.5!important"> 1</span>
<span style="margin:0px; padding:0px; color:rgb(0,0,255); line-height:1.5!important">public</span> ListNode detectCycle(ListNode head) {
<br style="margin:0px; padding:0px">
<span style="margin:0px; padding:0px; color:rgb(0,128,128); line-height:1.5!important"> 2</span>
<span style="margin:0px; padding:0px; color:rgb(0,0,255); line-height:1.5"1 |
|