1、寻找快慢链表的相遇点
快链表步长为2,慢链表步长为1
ListNode fast=head; ListNode slow=head; ListNode meetNode=null; while (fast != null && fast.next != null) { slow = slow.next; fast = fast.next.next; if (slow == fast) { meetNode=slow; break; } }
如果没有相遇点则说明无环。
2、遍历链表,直到快慢链表再次相遇
ListNode fast1=head; ListNode slow1=meetNode; while (fast1 != slow1) { fast1 = fast1.next; slow1 = slow1.next; } return slow1;
快链表起始点为head,慢链表起点为相遇点为meetNode。
双链表步长都为1,当双链表再次相遇即为环入口。
注:环入口节点并不是相遇点,但环链表一定有相遇点,因此判断环链表的因素就是链表是否有相遇点。