【LeetCode】【C++】Linked list cycle 2
Given a linked list, return the node where the cycle begins. If there is no cycle, return null
.
Follow up:
Can you solve it without using extra space?
此題不難,但想不用extra space做出來還是要動點腦筋的,因為我之前看過類似的演算法題,所以就很快想到了。
方法是利用兩個指標從頭開始,指標p1一次走一步,指標p2一次走兩步,如果有環則兩指標必定有重逢之時(這是Linked List Cycle裡用到的)。
然後就是如何求出環的起始節點。
可以這麼假定,從鏈的起點到環的起點,這段距離稱為a。環的長度稱為c,第一次相遇位置距環的起點距離為p。首先p1被p2追上時它一定沒有走完整個環(想想為什麼?)也就是說0<p<c.所以從出發到相遇,p1走過的距離為a+p,p2走過的距離為a+p+nc(n為正整數)。又因為p2速度為p1兩倍,所以有
2a+2p=a+p+nc,所以有a+p=nc。現在兩指標均處在環起點過p的位置上,再走a個距離即可回到環的起點。而a恰好是鏈的起點到環的起點的距離,所以我們另其中一指標回到鏈的起點,另一指標仍在原地,同時以速度1前進,再次相遇一定是在環的起點了。
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode *detectCycle(ListNode *head) { ListNode *p1=head; ListNode *p2=head; bool hasCycle = false; if (!head) return NULL; while(p2->next!=NULL){ p1 = p1->next; p2 = p2->next->next; if (p2 == NULL) return NULL; if (p1 == p2){ hasCircle = true; break; } } if (!hasCycle) return NULL; else{ p2 = head; while (p1!=p2){ p1 = p1->next; p2 = p2->next; } return p1; } } };
相關推薦
【LeetCode】【C++】Linked list cycle 2
Given a linked list, return the node where the cycle begins. If there is no cycle, return null. Follow up: Can you solve it without usi
leetcode鏈表--6、linked-list-cycle-ii(有環單鏈表環的入口結點)
pre you head lis 頭結點 tex -a init int 題目描述 Given a linked list, return the node where the cycle begins. If there is no cycle, returnnull
LeetCode-Easy刷題(32) Linked List Cycle
Given a linked list, determine if it has a cycle in it. Follow up: Can you solve it without using extra space? 給定一個連結串列,確定它是否有一個迴圈
LeetCode刷題EASY篇Linked List Cycle
題目 判斷一個連結串列是否有環 Given a linked list, determine if it has a cycle in it. Follow up: Can you solve it without using extra space? 我的嘗試 沒有思路
【Leetcode】 328. Odd Even Linked List
直接 ++ next rem dev rgs pac groups [] Given a singly linked list, group all odd nodes together followed by the even nodes. Please note her
【LeetCode題解】142_環形連結串列2(Linked-List-Cycle-II)
目錄 描述 解法一:雜湊表 思路 Java 實現 Python 實現 複雜度分析 解法二:雙指標 思路 Java 實現 Python 實現 複雜度分析 描述 給定一個連結串列,返回連結串列開始入
【LeetCode】Linked List Cycle II(環形連結串列 II)
這是LeetCode裡的第142道題。 題目要求: 給定一個連結串列,返回連結串列開始入環的第一個節點。 如果連結串列無環,則返回 null。 說明:不允許修改給定的連結串列。 進階:你是否可以不用額外空間解決此題? 起初我在做這道題的時候,
【LeetCode】141. 環形連結串列(Linked List Cycle)
【 英文練習 | 中文練習 】 題目描述: 給定一個連結串列,判斷連結串列中是否有環。 解題思路: 一種方法可以使用 Hash Table ,判斷該結點之前是否遇到過;更優的方法是使用雙指標,一個指標每次移動一個結點,一個指標每次移動兩個結點,如果存在環,那麼這兩個指標一定會相遇
【演算法分析】如何理解快慢指標?判斷linked list中是否有環、找到環的起始節點位置。以Leetcode 141. Linked List Cycle, 142. Linked List Cycle II 為例Python實現
快慢指標簡述 快慢指標經常用於連結串列(linked list)中環(Cycle)相關的問題。 快指標(fast pointer)和慢指標(slow pointer)都從連結串列的head出發。 slow pointer每次移動一格,而快指標每次移動兩格。 如果快慢指標能相遇,則證明連結串列中有環;否則沒有
【LeetCode】#142環形連結串列II(Linked List Cycle II)
【LeetCode】#142環形連結串列II(Linked List Cycle II) 題目描述 給定一個連結串列,返回連結串列開始入環的第一個節點。 如果連結串列無環,則返回 null。 為了表示給定連結串列中的環,我們使用整數 pos 來表示連結串列尾連線到連結串列中的位置(索
【LeetCode】#141環形連結串列(Linked List Cycle)
【LeetCode】#141環形連結串列(Linked List Cycle) 題目描述 給定一個連結串列,判斷連結串列中是否有環。 為了表示給定連結串列中的環,我們使用整數 pos 來表示連結串列尾連線到連結串列中的位置(索引從 0 開始)。 如果 pos 是 -1,則在該連結串列
【LeetCode-面試演算法經典-Java實現】【142-Linked List Cycle II(單鏈表中有環II)】
原題 Given a linked list, return the node where the cycle begins. If there is no cycle, retu
【leetcode】141.(Easy)Linked List Cycle
解題思路: 維護一個map,如果當前節點的下一個節點是已經存在的節點(map中的節點)則連結串列有迴圈 提交程式碼: class Solution { public boolean hasCycle(ListNode head) { if(head==n
【python3】leetcode 141. Linked List Cycle (easy)
141. Linked List Cycle (easy) Given a linked list, determine if it has a cycle in it. To represent a cycle in the given linked list,
【LeetCode】328. Odd Even Linked List
Problem:Given a singly linked list, group all odd nodes together followed by the even nodes. Please note here we are talking about the nod
【LeetCode-面試演算法經典-Java實現】【114-Flatten Binary Tree to Linked List(二叉樹轉單鏈表)】
原題 Given a binary tree, flatten it to a linked list in-place. For example, Given
【leetcode】Linked List Cycle II,判斷連結串列是否有環
本題意思是無修改的判斷一個連結串列是否具有環,並且返回環的初始節點,否則返回NULL。 一種方法是對已經訪問到的節點設定一些標誌,比如將next指標指向某一個特定節點,或者其他方法等。這樣的問題是
【LeetCode每天一題】Reverse Linked List(鏈表反轉)
指向 -s sin ive n) 空間 col 鏈表 info Reverse a singly linked list. Example: Input: 1->2->3->4->5->NULL
【Lintcode】102.Linked List Cycle
node false col lint tro head -s tno cycle 題目: Given a linked list, determine if it has a cycle in it. Example Given -21->10->4->
【easy】141. Linked List Cycle
next sin span for 指針 slow nod fast 有環 非常簡單的題:判斷鏈表有沒有環(用快慢指針) /** * Definition for singly-linked list. * struct ListNode { * int v