1. 程式人生 > >【LeetCode】【C++】Linked list cycle 2

【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;
        }
        
    }
};


相關推薦

LeetCodeC++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_環形連結串列2Linked-List-Cycle-II)

目錄 描述 解法一:雜湊表 思路 Java 實現 Python 實現 複雜度分析 解法二:雙指標 思路 Java 實現 Python 實現 複雜度分析 描述 給定一個連結串列,返回連結串列開始入

LeetCodeLinked List Cycle II(環形連結串列 II)

這是LeetCode裡的第142道題。 題目要求: 給定一個連結串列,返回連結串列開始入環的第一個節點。 如果連結串列無環,則返回 null。 說明:不允許修改給定的連結串列。 進階:你是否可以不用額外空間解決此題? 起初我在做這道題的時候,

LeetCode141. 環形連結串列(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

leetcode141.(Easy)Linked List Cycle

解題思路: 維護一個map,如果當前節點的下一個節點是已經存在的節點(map中的節點)則連結串列有迴圈 提交程式碼: class Solution { public boolean hasCycle(ListNode head) { if(head==n

python3leetcode 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,

LeetCode328. 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

leetcodeLinked 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

Lintcode102.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->

easy141. Linked List Cycle

next sin span for 指針 slow nod fast 有環 非常簡單的題:判斷鏈表有沒有環(用快慢指針) /** * Definition for singly-linked list. * struct ListNode { * int v