鏈表中環(huán)的入口結點

描述

給一個長度為n鏈表,若其中包含環(huán),請找出該鏈表的環(huán)的入口結點,否則,返回null。

數(shù)據(jù)范圍: n≤10000,1<=結點值<=10000

要求:空間復雜度 O(1),時間復雜度 O(n)

例如,輸入{1,2},{3,4,5}時,對應的環(huán)形鏈表如下圖所示:


鏈表示意圖.png

可以看到環(huán)的入口結點的結點值為3,所以返回結點值為3的結點。

輸入描述:

輸入分為2段,第一段是入環(huán)前的鏈表部分,第二段是鏈表環(huán)的部分,后臺會根據(jù)第二段是否為空將這兩段組裝成一個無環(huán)或者有環(huán)單鏈表

返回值描述:

返回鏈表的環(huán)的入口結點即可,我們后臺程序會打印這個結點對應的結點值;若沒有,則返回對應編程語言的空結點即可。

示例1

輸入:{1,2},{3,4,5}
返回值:3
說明:返回環(huán)形鏈表入口結點,我們后臺程序會打印該環(huán)形鏈表入口結點對應的結點值,即3

示例2

輸入:{1},{}
返回值:"null"
說明:沒有環(huán),返回對應編程語言的空結點,后臺程序會打印"null"

示例3

輸入:{},{2}
返回值:2
說明:環(huán)的部分只有一個結點,所以返回該環(huán)形鏈表入口結點,后臺程序打印該結點對應的結點值,即2

解題思路分析:

1、根據(jù)快慢指針找到相遇點;
2、如果無環(huán),直接返回Null,
3、有環(huán)的情況下,定義一個新指針從頭開始和快指針每次各走一步,二者相等的地方便是環(huán)的入口結點;

具體代碼實現(xiàn)如下:

public ListNode EntryNodeOfLoop(ListNode pHead) {
        boolean hasCycle = false;
        ListNode fast = pHead;
        ListNode slow = pHead;
        while (fast.next != null && fast.next.next != null) {
            slow = slow.next;
            fast = fast.next.next;
            if (slow == fast) { //先找到鏈表相遇的地方
                hasCycle = true;
                break;
            }
        }
        if (!hasCycle) {
            return null;
        }
        ListNode prev = pHead;
        while (fast !=prev) { //一個指針從頭開始走,fast指針每次走一步,兩者相遇的地方就是入口處
            fast = fast.next;
            prev = prev.next;
        }
        return prev;
    }
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容