欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 名人名企 > 【LeetCode】【算法】142. 环形链表II

【LeetCode】【算法】142. 环形链表II

2025/2/24 9:03:05 来源:https://blog.csdn.net/passer__jw767/article/details/143512913  浏览:    关键词:【LeetCode】【算法】142. 环形链表II

142环形链表II

题目描述

给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。
不允许修改链表。

做题思路

这道题实际就做两件事:
第一件事是检查链表是否有环
第二件事是寻找链表的入口

  1. 检查链表是否有环如环形链表I一样,通过快慢指针来实现,当快指针的nextnext.next不为null的时候就一直进行while循环,快指针一次走两步,慢指针一次走一步,如果快慢指针相遇则说明有环,否则无环;
  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) {ListNode slowNode = head;ListNode fastNode = head;while (fastNode != null && fastNode.next != null) {slowNode = slowNode.next;fastNode = fastNode.next.next;if (slowNode == fastNode) {ListNode cur = head;while (cur != slowNode) {cur = cur.next;slowNode = slowNode.next;}return cur;}}return null;}
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词