一個鏈表中包含環,請找出該鏈表的環的入口結點。
IDEA
1.首先判斷鏈表是否帶環。
采用在頭結點設兩個指針,一個叫fast,一個叫slow,fast一下走兩步,而slow一下走一步。如果鏈表中存在環的話,那么fast和slow必定會在環中相遇。若鏈表中沒有環的話,那么fast必定現于slow指針先到達鏈表的尾節點(->next = Null)。
2.找出環的入口點。
相遇的時候,slow共移動了s步,fast共移動了2s步。定義a:鏈表頭移動a步到達入口點。定義x:入口點移動x步到達相遇點。定義c:環長度。有2s=s+nc=>s=ncs=a+x=>a+x=nc=>a=nc-x=>a=nc-c+c-x=(n-1)c+(c-x)即c-x為相遇點到環入口點的距離,由此可知,從鏈表頭到環入口點等于(n-1)循環內環+相遇點到環入口點,于是我們從鏈表頭、與相遇點分別設一個指針,每次各走一步,兩個指針必定相遇,且相遇第一點為環入口點。
2.可以計算環的長度。
再環的入口點設一指針和一計數器,讓這一指針在環里面跑,計數器不斷自增。當這一指針回到環的入口點的時候,環長就出來啦。
CODE
/* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/public class Solution { public ListNode EntryNodeOfLoop(ListNode pHead) { if(pHead==null||pHead.next==null) return null; ListNode slow=pHead,fast=pHead; while(fast!=null&&fast.next!=null){ slow=slow.next; fast=fast.next.next; if(slow==fast) break; } if(fast==null||fast.next==null) return null; slow=pHead; while(slow!=fast){ slow=slow.next; fast=fast.next; } return slow; }}
新聞熱點
疑難解答