zoukankan      html  css  js  c++  java
  • 链表成环的新解法

    题目描述:

    给定一个链表,判断链表中是否有环。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。

    示例1:

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

     示例2:

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

      

    解题分析:

    题解一:哈希表判定

    思路:通过hash表来检测节点之前是否被访问过,来判断链表是否成环。这是最容易想到的一种题解了

    func hasCycle(head *ListNode) bool {
        m := make(map[*ListNode]int)
        for head != nil {
            if _,exist := m[head];exist {
                return true
            }
            m[head]= 1
            head = head.Next
        }
        return false
    }

    题解三:双指针解法

    思路来源:先想象一下,两名运动员以不同速度在跑道上进行跑步会怎么样?相遇!好了,这道题你会了。

    解题方法:通过使用具有 不同速度 的快、慢两个指针遍历链表,空间复杂度可以被降低至 O(1)。慢指针每次移动一步,而快指针每次移动两步

    假设链表为

    其步骤如下:

    func hasCycle(head *ListNode) bool {  
        if head == nil {
            return false
        }
        fast := head.Next       // 快指针,每次走两步
        for fast != nil && head != nil && fast.Next != nil {
            if fast == head {   // 快慢指针相遇,表示有环
                return true
            }
            fast = fast.Next.Next  
            head = head.Next        // 慢指针,每次走一步
        }
        return false
    }
    

      地址:https://mp.weixin.qq.com/s/ZlskhjXDi6WzfKLX4d2ufg

    small_lei_it 技术无止境,追求更高。
  • 相关阅读:
    8-21模拟赛解题报告
    8-20模拟赛解题报告
    8-19模拟赛解题报告
    8-18模拟赛解题报告
    8-27复习(写题)报告
    [省赛训练(DP)]Course Selection System
    Trie(字典树)的基本操作与应用(一般与字符串前缀相关)
    [算法学习]欧拉筛
    构造函数运行的机制
    js基本数据类型之间的转换
  • 原文地址:https://www.cnblogs.com/smallleiit/p/13611933.html
Copyright © 2011-2022 走看看