摘要:做法如果有環(huán),快慢指針必定可以相遇。而讓此時重新從起點出發(fā),以和相同的速度,需要走非環(huán)路的直線長度,才能到達環(huán)的起點。也就是說,,就是第二個循環(huán)結(jié)束的條件。
Linked List Cycle I Problem
Given a linked list, determine if it has a cycle in it.
ExampleGiven -21->10->4->5, tail connects to node index 1, return true
Note做法:如果有環(huán),快慢指針必定可以相遇。
注意兩點:初始化快慢指針的時候,fast要在slow后面,也就是head.next;由于fast一次走兩步,所以while循環(huán)里要判斷兩個位置是否為null:fast和fast.next。
public class Solution { public boolean hasCycle(ListNode head) { if (head == null/* ||head.next == null */) return false; ListNode fast = head.next; ListNode slow = head; while (fast != slow) { if (fast == null || fast.next == null) return false; fast = fast.next.next; slow = slow.next; } return true; } }Linked List Cycle II Problem
Given a linked list, return the node where the cycle begins.
If there is no cycle, return null.
ExampleGiven -21->10->4->5, tail connects to node index 1,return 10.
Note畫一個簡圖:
a: length of non-loop 非環(huán)直線的長度 b: length of loop 環(huán)的長度 x: the point slow and fast meet in the loop 快慢指針在環(huán)內(nèi)相遇的位置 --------oooo o o ooxo
(a+x)*2 = a-1+kb+x --> a = kb-1-x, slow needs to go kb-x longer to finish the loop.
so if head wants to go to the start point of the loop, it would pass a, the same for slow. After head went a, slow went kb-x-1. However, a = kb-x-1, so head is slow.next at the loop, which is the start point of the loop.
slow在fast在環(huán)里的k處相遇,fast比slow走了兩倍的路程,假設(shè)非環(huán)路和環(huán)路長度分別為a和b,且fast已經(jīng)在環(huán)里多走了k圈,所以:
(a+x)*2 = a-1+kb+x --> a = kb-1-x
此時,slow還要走kb-x才能走完整個環(huán)。
而讓head此時重新從起點出發(fā),以和slow相同的速度,需要走非環(huán)路的直線長度a,才能到達環(huán)的起點。
那么,head到達環(huán)的時候,走了a = kb-1-x:是slow在環(huán)內(nèi)走到環(huán)的起點的路程-1。
也就是說,slow.next = head,就是第二個while循環(huán)結(jié)束的條件。
public class Solution { public ListNode detectCycle(ListNode head) { if (head == null) return null; ListNode fast = head.next; ListNode slow = head; while (fast != slow) { if (fast == null || fast.next == null) return null; fast = fast.next.next; slow = slow.next; } while (head != slow.next) { head = head.next; slow = slow.next; } return head; } }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/65557.html
摘要:題目要求這道題目要求判斷一個鏈表中是否有環(huán),如果有環(huán),就返回環(huán)中的第一個節(jié)點。如果有環(huán),就會重復(fù)遇到這個指向的節(jié)點。則該鏈表有環(huán),且該節(jié)點就是環(huán)的起始節(jié)點。但是這個方法會毀壞原來鏈表的數(shù)據(jù)結(jié)構(gòu)。 題目要求 Given a linked list, return the node where the cycle begins. If there is no cycle, return n...
摘要:說明不允許修改給定的鏈表。算法思路題目要求返回單鏈表中存在循環(huán)鏈表的位置。首先,先判斷該單鏈表是否存在循環(huán)鏈表用兩個快慢指針分別指向鏈表的頭部,每次移動兩步,每次移動一步,移動的步數(shù)是的兩倍。 Time:2019/4/8Title: Linked List Cycle IIDifficulty: mediumAuthor:小鹿 題目:Linked List Cycle II Giv...
摘要:如果鏈表無環(huán),則返回。說明不允許修改給定的鏈表。示例輸入輸出解釋鏈表中有一個環(huán),其尾部連接到第一個節(jié)點。兩種方法哈希表哈希表添加節(jié)點時只要發(fā)現(xiàn)節(jié)點已經(jīng)存在了,證明就有環(huán)形鏈表。 給定一個鏈表,返回鏈表開始入環(huán)的第一個節(jié)點。 如果鏈表無環(huán),則返回 null。 為了表示給定鏈表中的環(huán),我們使用整數(shù) pos 來表示鏈表尾連接到鏈表中的位置(索引從 0 開始)。 如果 pos 是 -1,則在該...
摘要:如果鏈表無環(huán),則返回。說明不允許修改給定的鏈表。示例輸入輸出解釋鏈表中有一個環(huán),其尾部連接到第一個節(jié)點。兩種方法哈希表哈希表添加節(jié)點時只要發(fā)現(xiàn)節(jié)點已經(jīng)存在了,證明就有環(huán)形鏈表。 給定一個鏈表,返回鏈表開始入環(huán)的第一個節(jié)點。 如果鏈表無環(huán),則返回 null。 為了表示給定鏈表中的環(huán),我們使用整數(shù) pos 來表示鏈表尾連接到鏈表中的位置(索引從 0 開始)。 如果 pos 是 -1,則在該...
Reverse Linked List Reverse a singly linked list. Note Create tail = null; Head loop through the list: Store head.next, head points to tail, tail becomes head, head goes to stored head.next; Return t...
閱讀 742·2021-07-25 21:37
閱讀 3654·2019-08-30 15:55
閱讀 2572·2019-08-30 15:54
閱讀 1717·2019-08-30 15:44
閱讀 3123·2019-08-30 15:44
閱讀 859·2019-08-30 15:43
閱讀 1024·2019-08-29 15:36
閱讀 3038·2019-08-29 10:58