LeetCode 面试题 02.08. 环路检测

这篇具有很好参考价值的文章主要介绍了LeetCode 面试题 02.08. 环路检测。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、题目

  给定一个链表,如果它是有环链表,实现一个算法返回环路的开头节点。若环不存在,请返回 null

  如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。

  点击此处跳转题目。

示例 1:

LeetCode 面试题 02.08. 环路检测,LeetCode写题记录,leetcode,算法,职场和发展,c#

输入:head = [3,2,0,-4], pos = 1
输出:tail connects to node index 1
解释:链表中有一个环,其尾部连接到第二个节点。

示例 2:

LeetCode 面试题 02.08. 环路检测,LeetCode写题记录,leetcode,算法,职场和发展,c#

输入:head = [1,2], pos = 0
输出:tail connects to node index 0
解释:链表中有一个环,其尾部连接到第一个节点。

示例 3:

LeetCode 面试题 02.08. 环路检测,LeetCode写题记录,leetcode,算法,职场和发展,c#

输入:head = [1], pos = -1
输出:no cycle
解释:链表中没有环。

进阶:

  • 你是否可以不用额外空间解决此题?

二、C# 题解

  使用快慢指针 p、q 依次遍历,可以证明,当快慢指针相交时,此时慢指针 p 和头指针 head 前进相交处即为环路开头节点:文章来源地址https://www.toymoban.com/news/detail-689576.html

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     public int val;
 *     public ListNode next;
 *     public ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public ListNode DetectCycle(ListNode head) {
        if (head == null) return null;
        ListNode p = head, q = p;

        //  快慢指针相交
        do {
            if (p != null) p = p.next;
            if (q != null) q = q.next;
            if (q != null) q = q.next;
        } while (p != q);

        if (p == null) return null; // 检查空

        // 寻找环路开头节点
        while (p != head) {
            p = p.next;
            head = head.next;
        }

        return p;
    }
}
  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( 1 ) O(1) O(1)

到了这里,关于LeetCode 面试题 02.08. 环路检测的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • leetcode 面试题 02.02. 返回倒数第k个节点

    提建议就是,有些题还是有联系的,建议就收看完  876.链表的中间节点( ) ,再将这一题联系起来 题目: 实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。 说明: 给定的 k 保证是有效的。 题目链接 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 文

    2024年02月04日
    浏览(37)
  • LeetCode 面试题 02.02. 返回倒数第 k 个节点

      实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。   注意:本题相对原题稍作改动   点击此处跳转题目。 示例: 输入: 1-2-3-4-5 和 k = 2 输出: 4 说明: 给定的 k 保证是有效的。   先遍历一遍求总结点数 n,再顺序寻找第 n - k + 1 个节点就可以了

    2024年02月11日
    浏览(39)
  • LeetCode 面试题 02.03. 删除中间节点

      若链表中的某个节点,既不是链表头节点,也不是链表尾节点,则称其为该链表的「中间节点」。 假定已知链表的某一个中间节点,请实现一种算法,将该节点从链表中删除。   例如,传入节点 c (位于单向链表 a-b-c-d-e-f 中),将其删除后,剩余链表为 a-b-d-e-f   

    2024年02月11日
    浏览(42)
  • leetcode 面试题 02.07. 链表相交

    题目:leetcode 面试题 02.07. 链表相交 描述: 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。 图示两个链表在节点 c1 开始相交: 思路: 简单来说,就是求两个链表交点节点的指针。 这里要注意,交点

    2024年02月13日
    浏览(40)
  • LeetCode 面试题 02.04. 分割链表

      给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。   你不需要 保留 每个分区中各节点的初始相对位置。   点击此处跳转题目。 示例 1: 输入:head = [1,4,3,2,5,2], x = 3 输出:[1,2,2,4,3,5] 示例

    2024年02月11日
    浏览(38)
  • 【每日一题】Leetcode - 面试题 17.08. Circus Tower LCCI

    Leetcode - 面试题 17.08. Circus Tower LCCI Sorting heights to be ascending order and weights to be descending order. dp[i] = j represents person[i] as the bottom of tower, the tower height is amount of j, to calculate the dp[i] we find the maximum of dp[0 ~ (i-1)] what the person[0 ~ (i-1)] shorter and lighter than person[i], increase it of one, it’s th

    2024年02月13日
    浏览(44)
  • leetcode 面试题 02.05 链表求和

    🌟 leetcode链接:面试题 02.05 链表求和 ps: 首先定义一个头尾指针 head 、 tail ,这里的 tail 是方便我们尾插,每次不需要遍历找尾,由于这些数是反向存在的,所以我们直接加起来若大于等于 10 则进位,进位的数字加到下一位的数字和上,需要注意的是,当任意一个链表结束

    2024年02月12日
    浏览(39)
  • LeetCode 面试题 02.01. 移除重复节点

      编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。   点击此处跳转题目。 示例1: 输入:[1, 2, 3, 3, 2, 1] 输出:[1, 2, 3] 示例2: 输入:[1, 1, 1, 1, 2] 输出:[1, 2] 提示: 链表长度在[0, 20000]范围内。 链表元素在[0, 20000]范围内。 进阶: 如果不得使用临时缓冲

    2024年02月11日
    浏览(39)
  • LeetCode 面试题 03.02. 栈的最小值

      请设计一个栈,除了常规栈支持的 pop 与 push 函数以外,还支持 min 函数,该函数返回栈元素中的最小值。执行 push 、 pop 和 min 操作的时间复杂度必须为 O(1) 。   点击此处跳转题目。 示例: MinStack minStack = new MinStack(); minStack.push(-2); minStack.push(0); minStack.push(-3); minStack

    2024年02月10日
    浏览(38)
  • leetcode刷题记录:二叉树02(思路篇)

    参考labuladong的算法小抄:https://labuladong.online/algo/data-structure/binary-tree-part1/ 复习二叉树纲领篇,二叉树解题的思维模式分两类: 1、是否可以通过遍历一遍二叉树得到答案?如果可以,用一个 traverse 函数配合外部变量来实现,这叫「遍历」的思维模式。 2、是否可以定义一个

    2024年02月19日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包