解法1
不知道什么原理。我写着写着就出来了,测试过也没有问题,有知道原理的可以告诉我
package linkedlist;
/**
* Created by lijie35 on 2020-01-20 10:43 AM .
*/
public class ListEntrance {
public static void main(String[] args) {
// Node h1 = new Node(0);
// Node h2 = new Node(1);
// Node h3 = new Node(2);
// Node h4 = new Node(3);
// Node h5 = new Node(4);
// Node h6 = new Node(4);
// Node h7 = new Node(4);
// Node h8 = new Node(4);
// Node h9 = new Node(4);
Node node = AutoListUtil.cycle(100,99);
// System.out.println(node.next);
System.out.println(findEntrance(node).val);
// System.out.println(findEntrance(h3).val);
}
//查找入口
public static Node findEntrance(Node node) {
if (node == null || node.next == null)
return new Node(-1);
Node meetingPoint = mettingPoint(node);
//如果不是循环链表,就返回虚拟节点
if (meetingPoint == null)
return new Node(-1);
//设置开始指针
Node startPoint = node;
while (true) {
//如果像个相遇就返回
if (meetingPoint == startPoint) {
return startPoint;
}
//每次循环走一步
meetingPoint = meetingPoint.next;
startPoint = startPoint.next;
}
}
//查找到链表第一次相遇的节点
public static final Node mettingPoint(Node node) {
if (node == null || node.next == null)
return null;
Node slow = node;
Node fast = node;
while (true) {
slow = slow.next;
fast = fast.next.next;
if (fast == null || fast.next == null) {
return null;
}
if (fast == slow) {
return fast;
}
}
}
}
解法2
各个教科书里的解法