问题:
给定一个单链表,返回链表入环的第一个节点,如果没有环,返回null
// 找到链表第一个入环节点,如果无环,返回null
public static Node getLoopNode(Node head) {
if (head == null || head.next == null || head.next.next == null) {
return null;
}
// n1 慢 n2 快
Node n1 = head.next; // n1 -> slow
Node n2 = head.next.next; // n2 -> fast
while (n1 != n2) {
if (n2.next == null || n2.next.next == null) {
return null;
}
n2 = n2.next.next;
n1 = n1.next;
}
n2 = head; // n2 -> walk again from head
while (n1 != n2) {
n1 = n1.next;
n2 = n2.next;
}
return n1;
}
过程:
1)过滤条件;
2)快慢指针,快指针先走2步,慢指针先走1步,如果fast.next为空或者fast.next.next为空,证明链表无环;直到快慢指针相遇后退出;
3)快指针来到head节点,慢指针原地不动,快慢指针每次走1步,相遇后快/慢指针的节点就是结果;
结论:
记住结论就行,没必要证明