很多网上的算法指根据结论倒推出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); } }
相关推荐
javascript js_leetcode题解之142-linked-list-cycle-ii.js
给定一个链表,返回链表开始入环的第一个节点。如果链表无环,则返回 null。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从
python python_leetcode题解之142_Linked_List_Cycle_II
要考虑第一个节点要被删除的情况代码实现self.next = Nonedef removeElements(self, head: ListNode, val:
java java_leetcode-114-flatten-binary-tree-to-linked-list
javascript js_leetcode题解之141-linked-list-cycle.js
javascript js_leetcode题解之92-reverse-linked-list-ii.js
### Python 教程 LeetCode 代码模板 - Linked List & Two Pointers #### 一、双指针技术概览 在本教程中,我们将探讨一种在处理链表问题时非常有用的技巧——双指针技术。双指针技术的核心在于利用两个指针来遍历...
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
python python_leetcode题解之141_Linked_List_Cycle
示例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