diff --git "a/\347\256\227\346\263\225\346\200\235\347\273\264\347\263\273\345\210\227/\345\217\214\346\214\207\351\222\210\346\212\200\345\267\247.md" "b/\347\256\227\346\263\225\346\200\235\347\273\264\347\263\273\345\210\227/\345\217\214\346\214\207\351\222\210\346\212\200\345\267\247.md" index 003d0fa547908c7948df8c0cd2958bb0819fec56..c77dc4190929fb487e08c71f5e788c9ec0139efa 100644 --- "a/\347\256\227\346\263\225\346\200\235\347\273\264\347\263\273\345\210\227/\345\217\214\346\214\207\351\222\210\346\212\200\345\267\247.md" +++ "b/\347\256\227\346\263\225\346\200\235\347\273\264\347\263\273\345\210\227/\345\217\214\346\214\207\351\222\210\346\212\200\345\267\247.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] -``` \ No newline at end of file