1、環形鏈表
給定一個鏈表,判斷鏈表中是否有環。
爲了表示給定鏈表中的環,我們使用整數 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
給定一個鏈表,返回鏈表開始入環的第一個節點。 如果鏈表無環,則返回 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;
}