问题描述:
Given a linked list, return the node where the cycle begins. If there is no cycle, return null
.
Note: Do not modify the linked list.
Follow up:
Can you solve it without using extra space?
原问题链接:https://leetcode.com/problems/linked-list-cycle-ii/
问题分析
和前一个问题比起来,这个问题相对于前面一个问题更进一步。在这里不但要看是否存在有环,而且还要在有环的情况下判断那个存在环的入口在哪里。我们这里先讨论存在环的情况,对于一个单链表来说,它存在环的话只可能是类似于如下的形式:
假设从链表的开头到这个环的起始点的距离是a,而环的长度是b。在按照前面采用快慢指针的方式遍历环的时候,它们必然会在环的某个点相遇,假设这个点离环的起始点的距离为x。那么按照前面的假设,快指针肯定是走完了整个链表并加上x的这一段。它走过的距离应该是fast = a + nb + x(其中n表示快指针可能走过的环的圈数,n >= 1),而慢指针走过的距离是a + x,也就是说slow = a + x。同时,按照速度来说,快指针是慢指针的两倍,于是有 fast = 2 x slow。也就是说有 a + nb + x = 2a + 2x。
这样就有a = nb - x。也就是说,从链表的起始点到这个环的入口就是从两个指针相遇的点到环的起点再加上若干个环的距离,这里可能是0个或者多个环的距离。那么,从代码实现的角度来看,它里面不管走多少个环的距离,在环里头相当于还是回到了它原来的地方。而在环里头距离环入口x的位置再走个n -x的距离,它不就正好走到环的入口点了么?
这就是问题的关键所在,从链表的入口走到环的入口和从环里头两个相遇的节点的位置不断往前走的时候,它们会在环的入口位置相遇。所以,我们在实现的时候首先找到两个指针相遇的地方。然后再从链表的开头走一个指针过来,和环里面那个slow指针一起走。一旦它们相遇,那么那个点就是环的入口了。
详细代码实现如下:
/** * Definition for singly-linked list. * class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */ public class Solution { public ListNode detectCycle(ListNode head) { if(head == null || head.next == null) return null; ListNode fast = head, slow = head; while(fast != null && fast.next != null) { fast = fast.next.next; slow = slow.next; if(fast == slow) break; } if(fast == null || fast.next == null) return null; slow = head; while(fast != slow) { fast = fast.next; slow = slow.next; } return slow; } }
相关推荐
leetcode中文版 LeetCode/Cpp 本人刷题记录在此,包含题意理解与算法思路,包含在Cpp文件内部注释,后续会持续更新。 有不懂的可以联系ji648513181,同时也欢迎志同道合O的朋友一起合作更新。 已更新剑指Offer答案...
II(Linked List Cycle II) 2018.9.26 删除排序链表中的重复元素 II(Remove Duplicates from Sorted List II) 2018.9.27 重建二叉树(Rebuild Binary Tree) 2018.9.28 把字符串转换成整数(Convert a string to ...
leetcode中325题python leetcode 以 参考 和 Hash相关 1_两数之和 ...linked-list-cycle-ii 143 重排链表 reorder-list 148 排序链表 sort-list 234 回文链表 palindrome-linked-list 双指针遍历/滑动
leetcode 2 sum c LeetCode 帮助文档 ...Cycle 160 Easy Intersection of Two Linked Lists 203 Easy Remove Linked List Elements no 206 Easy Reverse Linked List 234 Easy Palindrome Linked List
python python_leetcode题解之142_Linked_List_Cycle_II
Linked_list_cycle.py: long_pressed_name.py: max_69_number.py: max_array_sum_after_negations.py: max_depth_n_ary_tree.py: max_string_split_score.py: max_sub_array.py: merge_2_trees.py: plus_one...
preorder-traversal链表reorder-list链表linked-list-cycle-ii链表linked-list-cycle动态规划word-break-ii动态规划word-break链表copy-list-with-random-pointer复杂度single-number-ii复杂度single-number动态规划
II Valid Sudoku linked list Palindrome linked list Linked List Cycle trees Convert Sorted Array to Binary Search Tree string and search First Bad Version Dynamic Programing *** Climbing Stairs Set ...
javascript js_leetcode题解之142-linked-list-cycle-ii.js
II 快慢指针再加个初始指针 慢指针到链表开始位置时, 快指针总是比他快k步(每次移动快1步, 移动k次), 第一次相遇的时候快慢指针位置距离链表起始位置差k步即在n-k的位置(链表环长度为n) Majority Element 多数投票...
python python_leetcode题解之141_Linked_List_Cycle
javascript js_leetcode题解之141-linked-list-cycle.js
leetcode添加元素使和等于 总结 按照类别分类来刷 刷当前题的时候,看下『题目描述』最底下有个『相似题目』,这些题的思路...linked-list-cycle-ii reverse-nodes-in-k-group 二叉树 实现一个二叉树 二叉树二叉树的
leetcode怎么销号 LeetCode便签 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 答案leetcode-java leetcode.com ...II Remove Duplicates from Sorted List com.leetcode.string Single Number com.leetcode.tree Balanced Binary Tree Maximum Depth of Binary Tree Same Tree
leetcode 不会 Leetcode Solutions in Java Linked List Linked List Cycle Given a linked list, determine if it has a cycle in it. public static boolean hasCycle(ListNode head) 快慢指针法,块指针从head....
142-环形链表:linked-list-cycle-ii 160-相交链表:intersection-of-two-linked-lists 206-反转一个单链表:reverse-linked-list 20-有效的括号:valid-parentheses 150-逆波兰表达式求值:evaluate-reverse-polish-...
leetcode leetcode-java leetcode刷题笔记 已做题目列表 1.Two Sum 3.Longest Substring Without Repeating Characters 5.Longest Palindromic Substring 20.Valid Parentheses 26.Remove Duplicates from Sorted ...
Linked List Cycle II**:找到链表环的长度,并给出进入环的第一个节点。 4. **解决链表问题的策略** - **迭代法**:使用循环遍历链表,通常适用于大多数链表操作。 - **递归法**:对于某些特定问题,如链表反转...
* [Linked List](https://github.com/kamyu104/LeetCode#linked-list) * [Stack](https://github.com/kamyu104/LeetCode#stack) * [Queue](https://github.com/kamyu104/LeetCode#queue) * [Heap]...