public class ListNode {
int val;
ListNode next;
public ListNode(int val) {
this.val = val;
}
}
//11.给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
public ListNode detectCycle(ListNode head) {
if (head == null){
return null;
}
//核心:从链表头部出发, 到入口点的距离,和从快慢指针的交汇处出发, 到入口点的距离相等.
ListNode fast = head;
ListNode slow = head;
while (fast != null && fast.next != null){
//快指针走两步
fast = fast.next.next;
//慢指针走一步
slow = slow.next;
if (fast == slow){
break;
}
}
if (fast == null || fast.next == null){
//不带环
return null;
}
// 循环结束之后, fast 和 slow 就已经重合了
ListNode cur1 = head;
ListNode cur2 = fast;
while (cur1 != cur2){
cur1 = cur1.next;
cur2 = cur2.next;
}
return cur1;
}
给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
最新推荐文章于 2022-08-15 19:41:20 发布