首页 > 代码库 > 142. Linked List Cycle II
142. Linked List Cycle II
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?
假设head到环的位置距离为a,俩pointer相遇距离环起始位置为b
2(a + b + mCycle) = a + b + nCycle;
=>a+b = (n-m)Cycle
a = (n-m)Cycle - b;
所以一开始俩个pointer相遇位置与head一同往下走,再次相遇的位置即为cycle起始点。
public ListNode DetectCycle(ListNode head) { if(head == null) return null; var slow = head; var fast = head; while(fast!= null && fast.next != null) { slow = slow.next; fast = fast.next.next; if(slow == fast) break; } if(fast== null || fast.next == null) return null; slow = head; while(slow != fast) { slow = slow.next; fast = fast.next; } return slow; }
扩展问题
http://www.cnblogs.com/hiddenfox/p/3408931.html
在网上搜集了一下这个问题相关的一些问题,思路开阔了不少,总结如下:
1. 环的长度是多少?
2. 如何找到环中第一个节点(即Linked List Cycle II)?
3. 如何将有环的链表变成单链表(解除环)?
4. 如何判断两个单链表是否有交点?如何找到第一个相交的节点?
142. Linked List Cycle II
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。