Leetcode刷題筆記 142 環形鍊錶II

2021-10-24 15:36:20 字數 2313 閱讀 5691

題目

給定乙個鍊錶,判斷鍊錶中是否有環。

如果鍊錶中有某個節點,可以通過連續跟蹤 next 指標再次到達,則鍊錶中存在環。 為了表示給定鍊錶中的環,我們使用整數 pos 來表示鍊錶尾連線到鍊錶中的位置(索引從 0 開始)。 如果 pos 是 -1,則在該鍊錶中沒有環。注意:pos 不作為引數進行傳遞,僅僅是為了標識鍊錶的實際情況。

如果鍊錶中存在環,則返回 true 。 否則,返回 false 。

高階:

你能用 o(1)(即,常量)記憶體解決此問題嗎?

示例1

輸入

輸出

返回索引為 1 的鍊錶節點

解釋

鍊錶中有乙個環,其尾部連線到第二個節點。

示例2

輸入

輸出

返回索引為 0 的鍊錶節點

解釋

鍊錶中有乙個環,其尾部連線到第乙個節點。

示例3

輸入

head = [1], pos = -1

輸出

返回null

解釋

鍊錶中沒有環

鍊錶中節點的數目範圍是 [0, 104]

-105

<= node.val <= 105

pos 為 -1 或者鍊錶中的乙個 有效索引 。

思路

方法1:

方法2:

假設走入環之前的距離為a,入環節點到快慢指標相遇的距離為b,快慢指標相遇節點到入環節點的距離為c,

快指標走的距離為a+n(b+c)+b

慢指標走的距離為a+b

快指標走的速度是慢指標的兩倍 a+n(b+c)+b = 2a+2b

a = c+(n-1)(b+c)

假設n=1,a=c,慢指標走距離c到達入環節點,我們這裡引入指標tmp=head,和慢指標一起運動,他們相遇的時候就是入環點

**

#include

#include

#include

#include

using

namespace std;

struct listnode };

/*遍歷節點

class solution

s.insert(head);

head = head->next;

}return nullptr;

}};*/

/*快慢指標

1. 假設走入環之前的距離為a,入環節點到快慢指標相遇的距離為b,快慢指標相遇節點到入環節點的距離為c,

2. 快指標走的距離為a+n(b+c)+b

3. 慢指標走的距離為a+b

4. 快指標走的速度是慢指標的兩倍 a+n(b+c)+b = 2a+2b

5. a = c+(n-1)(b+c)

6. 假設n=1,a=c,慢節點走c距離到達入環節點,我們這裡引入指標tmp=head,和慢節點一起運動,他們相遇的時候就是入環點

*/class

solution

listnode* slow = head;

listnode* fast = head-

>next;

while

(fast !=

nullptr

) fast = fast-

>next-

>next;

if(slow == fast)

return tmp;}}

return

nullptr;}

};intmain()

今天也是愛zz的一天哦!

leetcode刷題, 總結,記錄, 備忘142

leetcode142 given a linked list,return the node where the cycle begins.if there is no cycle,returnnull.note do not modify the linked list.follow up ca...

Leetcode刷題筆記

1.兩數之和給定乙個整數陣列nums 和乙個目標值target,請你在該陣列中找出和為目標值的那兩個整數,並返回他們的陣列下標。ps 你可以假設每種輸入只會對應乙個答案。但是,你不能重複利用這個陣列中同樣的元素。思路 用target減去nums中的每乙個數,並設立乙個字典來記錄對應的下標 class...

LeetCode刷題筆記

實現strstr 給定乙個 haystack 字串和乙個 needle 字串,在 haystack 字串中找出 needle 字串出現的第乙個位置 從0開始 如果不存在,則返回 1。示例 1 輸入 haystack hello needle ll 輸出 2 示例 2 輸入 haystack aaaa...