mirror of
https://github.com/labuladong/fucking-algorithm.git
synced 2025-07-05 12:04:37 +08:00
【142. 环形链表 II】【C++】
【142. 环形链表 II】【C++】
This commit is contained in:
100
算法思维系列/双指针技巧.md
100
算法思维系列/双指针技巧.md
@ -18,7 +18,7 @@
|
||||
|
||||
[141.环形链表](https://leetcode-cn.com/problems/linked-list-cycle)
|
||||
|
||||
[141.环形链表II](https://leetcode-cn.com/problems/linked-list-cycle-ii)
|
||||
[142.环形链表II](https://leetcode-cn.com/problems/linked-list-cycle-ii)
|
||||
|
||||
[167.两数之和 II - 输入有序数组](https://leetcode-cn.com/problems/two-sum-ii-input-array-is-sorted)
|
||||
|
||||
@ -237,6 +237,32 @@ void reverse(int[] nums) {
|
||||
|
||||
======其他语言代码======
|
||||
|
||||
### java
|
||||
|
||||
[zhengpj95](https://github.com/zhengpj95) 提供 Java 代码
|
||||
|
||||
```java
|
||||
public class Solution {
|
||||
public boolean hasCycle(ListNode head) {
|
||||
//链表为空或只有一个结点,无环
|
||||
if (head == null || head.next == null) return false;
|
||||
|
||||
ListNode fast = head, slow = head;
|
||||
while (fast != null && fast.next != null) {
|
||||
fast = fast.next.next;
|
||||
slow = slow.next;
|
||||
// 快慢指针相遇则表示有环
|
||||
if (fast == slow) return true;
|
||||
}
|
||||
|
||||
//fast指针到末尾,无环
|
||||
return false;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### c++
|
||||
|
||||
[deardeer7](https://github.com/DearDeer7/) 提供 C++ 代码
|
||||
```cpp
|
||||
class Solution {
|
||||
@ -259,6 +285,63 @@ public:
|
||||
};
|
||||
```
|
||||
|
||||
|
||||
[zhengpj95](https://github.com/zhengpj95) 提供 【2、已知链表中含有环,返回这个环的起始位置】 C++ 代码
|
||||
|
||||
> 其实快慢指针问题,也就是著名的 *[Floyd's cycle detection algorithm](https://en.wikipedia.org/wiki/Cycle_detection#Floyd's_Tortoise_and_Hare)* 问题。
|
||||
|
||||
```c++
|
||||
class Solution {
|
||||
public:
|
||||
ListNode *detectCycle(ListNode *head) {
|
||||
// 如果链表为空或者第一个结点的指针为空,则无环
|
||||
if (!head || !head->next) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// 快慢指针找相遇点
|
||||
ListNode *fast = head, *slow = head;
|
||||
while (fast && fast->next) {
|
||||
fast = fast->next->next;
|
||||
slow = slow->next;
|
||||
if (fast == slow) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
// 如果没有相遇点,表示没有环,直接返回即可
|
||||
// 此时,快慢指针要么指向同一个结点,要么快指针指向空(偶数个结点)或者倒数第一个结点(奇数个结点)
|
||||
if (fast != slow) {
|
||||
return NULL;
|
||||
}
|
||||
//让慢指针回到第一个结点,然后快慢指针重新同步前进,两指针相遇时就是环的起点位置
|
||||
slow = head;
|
||||
while (fast != slow) {
|
||||
fast = fast->next;
|
||||
slow = slow->next;
|
||||
}
|
||||
return fast;
|
||||
}
|
||||
};
|
||||
```
|
||||
|
||||
### python
|
||||
|
||||
[MarineJoker](https://github.com/MarineJoker) 提供 167.两数之和 II - 输入有序数组 Python 代码
|
||||
```python
|
||||
class Solution:
|
||||
def twoSum(self, numbers: List[int], target: int) -> List[int]:
|
||||
left, right = 0, len(numbers) - 1
|
||||
while left < right:
|
||||
two_sum = numbers[left] + numbers[right]
|
||||
if two_sum > target:
|
||||
right -= 1 # 使得two_sum变小
|
||||
elif two_sum < target:
|
||||
left += 1 # 使得two_sum变大
|
||||
elif two_sum == target:
|
||||
return [left+1, right+1] # 由于索引由1开始
|
||||
return [-1, -1]
|
||||
```
|
||||
|
||||
[ryandeng32](https://github.com/ryandeng32/) 提供 Python 代码
|
||||
```python
|
||||
class Solution:
|
||||
@ -280,18 +363,3 @@ class Solution:
|
||||
return False
|
||||
```
|
||||
|
||||
[MarineJoker](https://github.com/MarineJoker) 提供 167.两数之和 II - 输入有序数组 Python 代码
|
||||
```python
|
||||
class Solution:
|
||||
def twoSum(self, numbers: List[int], target: int) -> List[int]:
|
||||
left, right = 0, len(numbers) - 1
|
||||
while left < right:
|
||||
two_sum = numbers[left] + numbers[right]
|
||||
if two_sum > target:
|
||||
right -= 1 # 使得two_sum变小
|
||||
elif two_sum < target:
|
||||
left += 1 # 使得two_sum变大
|
||||
elif two_sum == target:
|
||||
return [left+1, right+1] # 由于索引由1开始
|
||||
return [-1, -1]
|
||||
```
|
Reference in New Issue
Block a user