未验证 提交 ea2301df 编写于 作者: B BruceCat 提交者: GitHub

【142. 环形链表 II】【C++】

【142. 环形链表 II】【C++】
......@@ -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]
```
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册