链表中环的入口结点

这篇博客讨论了一种解决链表中环的入口节点问题的算法。通过使用快慢指针,当快指针两次追上慢指针时,确定环的存在并找到相遇点。然后,从链表头节点和相遇点分别出发,两个指针各前进相同步长,最终会在环的入口节点相遇。这种方法在不使用额外空间的情况下,实现了O(1)的空间复杂度。
摘要由CSDN通过智能技术生成

1 题目链接

链表中环的入口结点

2 题目要求

对于一个给定的链表,返回环的入口节点,如果没有环,返回null
拓展:
你能给出不利用额外空间的解法么?

3 代码思路

人傻了,不利用额外空间意思是O(1)也不能用?这个是我钻牛角尖呢,还是题目描述不清楚呢?暂时理解为空间复杂度要求O(1)吧。

算法-链表入口结点-0

图中的思路理一下,清楚之后我们考虑,代码怎么写呢?倒走n,在单向链表上是不合理的,因此要转换为正向走过多少距离。通过慢指针我们能够清楚的看到,如果慢指针只走了m,那么不正是入口结点吗。因此我们只需要让慢指针从起点重新走,快指针从相遇结点开始走,两者同时走过距离m,即在入口处相遇。

4 代码实现

public class Solution {
    public ListNode detectCycle(ListNode head) {
        ListNode meetNode = getMeetNode(head);
        if(meetNode == null)
            return null;
        // 快指针从相遇结点,慢指针从起点,每次走一步,相遇即为入口结点
        ListNode slow = head;
        ListNode fast = meetNode;
        while(slow != fast){
            slow = slow.next;
            fast = fast.next;
        }
        return slow;
    }
   
    // 寻找相遇结点。快慢指针,快指针每次走两步,慢指针每次走一步。
    public ListNode getMeetNode(ListNode head){
        if(head == null)
            return null;
        ListNode slow = head;
        ListNode fast = head;
        // 无环则不在循环
        while(fast != null && fast.next != null){
            slow = slow.next;
            fast = fast.next.next;
            // 快慢指针相遇
            if(slow == fast)
                return slow;
        }
        return null;
    }
}

5 题目补充

5.1 双指针在链表中的使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木水先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值