劍指offer16

題目描述

給一個鏈表,若其中包含環,請找出該鏈表的環的入口結點,不然,輸出null。java

解題思路分析

  • 首先咱們應該判斷鏈表中是否有環,利用一個快慢指針,若是快指針最後還碰上了慢指針就說明鏈表中有環
  • 而後咱們須要找到環的入口節點,利用前面一步找到的環,固然前面確定是在環中相遇的,因此利用前面找到的環中的節點,先計算出環的長度,而後使一個指針先從頭走環的長度那麼長,而後使另外一個指針從頭開始走,最後兩個指針會相遇在環的入口節點。

代碼實現

public ListNode entryNodeOfLoop(ListNode pHead) {
    if (pHead == null) {
        return null;
    }
    //先找到環中的某個節點
    ListNode meetingNode = meetingNode(pHead);
    int count = 1;
    ListNode node = meetingNode;
    //計算環中的節點個數
    while (node.next != meetingNode) {
        count++;
        node = nodex.next;
    }
    ListNode node1 = pHead, node2 = pHead;
    //先讓一個節點走節點個數步
    for (int i = 0; i < count; i++) {
        node1 = node1.next;
    }
    //開始找到環的入口節點
    while (node1 != node2) {
        node1 = node1.next;
        node2 = node2.next;
    }
    return node2;
}

//返回環中的節點
public ListNode meetingNode(ListNode pHead) {
    //分別聲明快指針和慢指針
    ListNode slow = pHead, fast = pHead.next;
    while (fast != null) {
        if (fast == slow) {
            return fast;
        }
        slow = slow.next;
        fast = fast.next;
        //防止空指針異常
        if (fast != null) {
            fast = fast.next;
        }
    }
    return null;
}
複製代碼
相關文章
相關標籤/搜索