标签:技术 load class 快慢指针 移动 要求 info lse cycle
题解:hashset(没有达到进阶的要求)
/**
* 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) {
Set<ListNode> set = new HashSet<>();
ListNode node = head;
while(node!=null){
if(set.contains(node)) return node;
else set.add(node);
node=node.next;
}
return null;
}
}
题解:双指针
一个慢指针l和一个快指针r同时走,慢指针l一次走1步,快指针r一次走2步。当快慢指针相遇时,让另一个指针l0从头出发和慢指针l同时移动且步长都是1,当l0和l相等时就找到了入口节点。
证明思路:https://juejin.im/post/5e64a20ff265da570a5d5633#heading-2
/**
* 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) return null;
ListNode l=head,r=head,l0=head;
while(true){
l=l.next;
r=r.next==null? null:r.next.next;
if(l==r&&l!=null){
while(l!=l0){
l=l.next;
l0=l0.next;
}
return l;
}
if(r==null){
return null;
}
}
}
}
标签:技术 load class 快慢指针 移动 要求 info lse cycle
原文地址:https://www.cnblogs.com/cstdio1/p/13334581.html