Leetcode--141. 环形链表
給定一個鏈表,判斷鏈表中是否有環(huán)。
為了表示給定鏈表中的環(huán),我們使用整數(shù) pos 來表示鏈表尾連接到鏈表中的位置(索引從 0 開始)。 如果 pos 是 -1,則在該鏈表中沒有環(huán)。
?
示例 1:
輸入:head = [3,2,0,-4], pos = 1
輸出:true
解釋:鏈表中有一個環(huán),其尾部連接到第二個節(jié)點。
示例?2:
輸入:head = [1,2], pos = 0
輸出:true
解釋:鏈表中有一個環(huán),其尾部連接到第一個節(jié)點。
示例 3:
輸入:head = [1], pos = -1
輸出:false
解釋:鏈表中沒有環(huán)。
進階:
你能用 O(1)(即,常量)內(nèi)存解決此問題嗎?
思路:快慢指針法
兩個指針從頭開始遍歷,快指針每次走兩步,慢指針每次走兩步
設(shè)慢指針走了n步,快指針就走了2n,每次的差距為n步,所以如果有環(huán),快慢指針總會相遇
我們將慢指針的移動過程劃分為兩個階段:非環(huán)部分與環(huán)形部分:
1. 慢指針在走完非環(huán)部分階段后將進入環(huán)形部分:此時,快指針已經(jīng)進入環(huán)中,非環(huán)部分長度=N
2. 兩個指針都在環(huán)形區(qū)域中:考慮兩個在環(huán)形賽道上的運動員 - 快跑者每次移動兩步而慢跑者每次只移動一步。其速度的差值為 1
??? ?因此,在最糟糕的情形下,時間復雜度為 O(N+K),也就是 O(n)。
剛開始還考慮過會不會快的每次兩步,如何跳過慢指針,后來仔細一想,發(fā)現(xiàn)不是這樣的,因為慢指針也在移動
通俗點可以理解為他們的相對速度只差一個格子,快的只能一個一個格子的去追慢的,必然在一個格子相遇。
如果沒看懂,看下面的詳細。
一次跳2個與一次跳一個格子的追上之后,是一定會在一個格子遇到的。因為在即將追上的時候,快的那個落后慢的1個或者2個格子,無論哪種,落后1個的話,下一步正好追上,落后2個格子的話,下一步就落后1個格子了,也可以說即將追上的時候一定是相差1個格子,下一步一定在一個格子相遇。
提交的代碼:
/**
?* Definition for singly-linked list.
?* class ListNode {
?* ? ? int val;
?* ? ? ListNode next;
?* ? ? ListNode(int x) {
?* ? ? ? ? val = x;
?* ? ? ? ? next = null;
?* ? ? }
?* }
?*/
public class Solution {
? ? public boolean hasCycle(ListNode head) {
? ? ? ? if(head==null||head.next==null)
? ? ? ? {
? ? ? ? ? ? return false;
? ? ? ? }
? ? ? ? ListNode slow,fast;
? ? ? ? slow = head;
? ? ? ? fast = head.next;
? ? ? ? while(slow!=fast)
? ? ? ? {
? ? ? ? ? ? if(fast.next==null||fast.next.next==null)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? return false;
? ? ? ? ? ? }
? ? ? ? ? ? slow = slow.next;
? ? ? ? ? ? fast = fast.next.next;
? ? ? ? }
? ? ? ? return true;
? ? }
}
總結(jié)
以上是生活随笔為你收集整理的Leetcode--141. 环形链表的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 北理计算机教案,北理工版三年级信息技术教
- 下一篇: 动态规划--Leetcode64.最小路