很多网上的算法指根据结论倒推出a=c这样的结论,是错误的!
这道题比较注重数学推到,
如图,设置快慢两个指针,快指针的速度是慢指针的两倍
假设两个指针在z点相遇,那么快指针所走过的距离是慢指针的两倍
那么有以下公式,其中n代表快指针在环内转了n圈后行走b距离与慢指针相遇
2*(a+b)= a + b + n*(b+c) ====> a = (n-1)(b+c) + c
由这个推到结果可以知道,a的长度为n-1个环的长度加上c的长度
那么得出结论,相遇后,慢指针从链表头重新开始,快指针的速度和满指针一样继续前行,必然会在Y点相遇,相遇时快指针可能已经沿环转了多圈
package leetCode; /** * User: FR * Time: 10/28/14 1:35 PM * Given a linked list, return the node where the cycle begins. If there is no cycle, return null. * Follow up: * Can you solve it without using extra space? */ public class LinkedListCycle2 { public ListNode detectCycle(ListNode head) { if(head == null){ return null; } ListNode slow = head; ListNode fast = head.next; while (fast != null){ if(slow == fast){ slow = head; fast = fast.next; while (slow != fast){ slow = slow.next; fast = fast.next; } return slow; } slow = slow.next; fast = fast.next; if(fast != null){ fast = fast.next; } } return null; } class ListNode { int val; ListNode next; ListNode(int x) { val = x; next = null; } } public static void main(String[] args){ LinkedListCycle2 linkedListCycle = new LinkedListCycle2(); ListNode node1 = linkedListCycle.new ListNode(1); ListNode node2 = linkedListCycle.new ListNode(2); ListNode node3 = linkedListCycle.new ListNode(3); ListNode node4 = linkedListCycle.new ListNode(4); ListNode node5 = linkedListCycle.new ListNode(5); ListNode node6 = linkedListCycle.new ListNode(6); node1.next = node2; node2.next=node3; node3.next=node4; node4.next=node5; node5.next=node6; node6.next=node2; System.out.println(linkedListCycle.detectCycle(node1).val); } }
相关推荐
"python-leetcode题解之142-Linked-List-Cycle-II"不仅是对一个具体问题的解决,也是对数据结构和算法知识的一个全面复习和应用。通过解决这个问题,我们不仅能够加深对链表结构和快慢指针算法的理解,还可以提升...
给定一个链表,返回链表开始入环的第一个节点。如果链表无环,则返回 null。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从
环形链表II”问题涉及到对链表操作的理解,特别是检测链表中是否存在环,并找出环的起始位置。这个问题是链表问题中的一个经典问题,经常作为面试题出现,考察应聘者对数据结构和算法的理解及实现能力。 首先,我们...
要考虑第一个节点要被删除的情况代码实现self.next = Nonedef removeElements(self, head: ListNode, val:
java java_leetcode-114-flatten-binary-tree-to-linked-list
在解决“Python LeetCode题解之141-Linked-List-Cycle”这一问题时,我们首先需要了解链表的基本概念,包括单向链表和循环链表的定义及其特点。单向链表是一种由一系列节点组成的线性数据结构,每个节点都包含数据...
题号0092的题目是“Reverse Linked List II”,也就是“反转链表II”,这是一个涉及到链表操作的算法题目。在C语言中,解决这个问题需要对链表的节点进行翻转,并且要注意反转的范围是从第m个节点到第n个节点。这道...
### Python 教程 LeetCode 代码模板 - Linked List & Two Pointers #### 一、双指针技术概览 在本教程中,我们将探讨一种在处理链表问题时非常有用的技巧——双指针技术。双指针技术的核心在于利用两个指针来遍历...
JavaScript解题之92号问题:反转链表II 在JavaScript中,反转链表是一个...最终,通过上述步骤,我们可以得到一个完整的js-leetcode题解之92-reverse-linked-list-ii.js的代码实现,成功地对链表的一部分进行了反转。
java java_leetcode-113-path-sumII
本压缩包文件"leetcode-Linked-List-1:链表-1"显然是针对LeetCode平台上的链表相关问题进行的练习集合,其中包含了三个未具体说明的问题。标签为"系统开源"可能意味着这个资源是某个开源项目的一部分,允许用户查看...
Linked List Cycle II**:找到链表环的长度,并给出进入环的第一个节点。 4. **解决链表问题的策略** - **迭代法**:使用循环遍历链表,通常适用于大多数链表操作。 - **递归法**:对于某些特定问题,如链表反转...
java java_leetcode-73-set-matrix-zeroes
java java_leetcode-110-balanced-binary-tree
示例1输入: 1->1->2输出: 1->2示例2输入: 1->1->2->3->3输出: 1->2->3解题思路如果当前节点的值和下一个节点的值相等,则当前节
java java_leetcode-maximum-depth-of-binary-tree
java java_leetcode-99-recover-binary-search-tree
java java_leetcode-115-distinct-subsquences
java java_leetcode-101-symmetric-tree
java java_leetcode-100-same-tree