算法-環形鏈表問題

1、環形鏈表

141. 環形鏈表

在這裏插入圖片描述

給定一個鏈表,判斷鏈表中是否有環。

爲了表示給定鏈表中的環,我們使用整數 pos 來表示鏈表尾連接到鏈表中的位置(索引從 0 開始)。 如果 pos 是 -1,則在該鏈表中沒有環。

示例 1:
輸入:head = [3,2,0,-4], pos = 1
輸出:true
解釋:鏈表中有一個環,其尾部連接到第二個節點。


示例 2:

輸入:head = [1,2], pos = 0
輸出:true
解釋:鏈表中有一個環,其尾部連接到第一個節點。

示例 3:

輸入:head = [1], pos = -1
輸出:false
解釋:鏈表中沒有環。

進階:

你能用 O(1)(即,常量)內存解決此問題嗎?

本題算是一個非常高頻的題目了,主要考察我們的數學能力?

想象一個場景,我們在操場上跑步,跑的慢的有可能被“套圈”,即快慢指針在同一個地點相遇了。因爲不可能無限長,所以,我們只要讓一個指針走的快點,一個走的慢點,如果有環的話他們會直接相遇,如果沒環的話,他們必然有一個先到達終點,也就是null。

通常我們喜歡兩倍速走,例如在尋找鏈表中點等情況

    public boolean hasCycle(ListNode head) {
        if(head==null){
            return false;
        }
        //快慢指針不從同一個點開始,因爲他們上來不能相等
        ListNode quick=head.next,slow=head;
        while(quick!=slow){
            if(quick==null||quick.next==null){//有一個先走到終點,沒環
                return false;
            }
            slow=slow.next;
            quick=quick.next.next;
        }
        return true;
    }

2、環形鏈表II

142. 環形鏈表 II

給定一個鏈表,返回鏈表開始入環的第一個節點。 如果鏈表無環,則返回 null。

爲了表示給定鏈表中的環,我們使用整數 pos 來表示鏈表尾連接到鏈表中的位置(索引從 0 開始)。 如果 pos 是 -1,則在該鏈表中沒有環。

說明:不允許修改給定的鏈表。

 

示例 1:

輸入:head = [3,2,0,-4], pos = 1
輸出:tail connects to node index 1
解釋:鏈表中有一個環,其尾部連接到第二個節點。


示例 2:

輸入:head = [1,2], pos = 0
輸出:tail connects to node index 0
解釋:鏈表中有一個環,其尾部連接到第一個節點。


示例 3:

輸入:head = [1], pos = -1
輸出:no cycle
解釋:鏈表中沒有環。
進階:
你是否可以不用額外空間解決此題?

本題用hash法可以秒出結果,不過面試官不會同意的,所以還是要交給快慢指針去做

在這裏插入圖片描述

    public ListNode detectCycle(ListNode head) {
        ListNode quick=head,slow=head;
        while(quick!=null&&quick.next!=null){
            quick=quick.next.next;
            slow=slow.next;
            if(quick==slow){
                slow=head;
                while(slow!=quick){
                    slow=slow.next;
                    quick=quick.next;
                }
                return slow;
            }
        }
        return null;

    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章