力扣hot100:環形鏈表(快慢指針法)(141)

一、題目描述


二、思路分析

這是鏈表題目中的經典問題,核心就是 如何判斷鏈表是否有環
常見的兩種方法有:

  1. 哈希表法:用一個集合存儲訪問過的節點,如果再次遇到相同節點說明有環。

    • 缺點:需要額外的空間,空間復雜度 O(n)。

  2. 快慢指針法(Floyd 判圈算法):通過兩個速度不同的指針在鏈表中移動,如果存在環,那么快指針一定會在環中追上慢指針。

    • 優點:只需常數空間,空間復雜度 O(1)。

    • 這也是本題的最優解。

你的代碼實現采用了第二種方法,也就是 快慢指針法


三、代碼講解

下面是我的實現代碼:

public class Solution {public boolean hasCycle(ListNode head) {if (head == null || head.next == null) {return false;}ListNode slow = head;ListNode fast = head.next;while (slow != fast) {if (fast == null || fast.next == null) {return false;}slow = slow.next;fast = fast.next.next;if (slow == fast) {return true;}}return true;}
}

1. 邊界條件

if (head == null || head.next == null) {return false;
}

如果鏈表為空,或者只有一個節點(且沒有環),那么顯然不可能存在環,直接返回 false


2. 初始化快慢指針

ListNode slow = head;
ListNode fast = head.next;

  • slow 每次走一步;

  • fast 每次走兩步。
    這樣設計可以保證在有環的情況下,快指針一定會在環中追上慢指針。


3. 循環遍歷

while (slow != fast) {if (fast == null || fast.next == null) {return false;}slow = slow.next;fast = fast.next.next;if (slow == fast) {return true;}
}

  • 如果快指針走到 null,說明鏈表沒有環(因為如果有環,快指針永遠不會走到盡頭)。

  • 如果 slow == fast,則說明快慢指針在環中相遇,即鏈表存在環。


4. 返回結果

最終,如果跳出 while 循環,說明 slow == fast,返回 true


四、復雜度分析

  • 時間復雜度:O(n)

    • 最壞情況下,快慢指針要遍歷鏈表的所有節點,復雜度為線性級別。

  • 空間復雜度:O(1)

    • 只用了兩個指針變量,不需要額外存儲空間。


五、總結

  • 本題是典型的 快慢指針 應用場景。

  • 通過設置不同速度的指針來判斷是否存在環,大大節省了空間。

  • 此題也是后續 環形鏈表 II(尋找環的入口節點)的基礎。


? 總結一句話:
在鏈表問題里,如果涉及到“是否存在環”,首先考慮快慢指針。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/96443.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/96443.shtml
英文地址,請注明出處:http://en.pswp.cn/web/96443.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

AI 智能編碼工具:重塑開發效率的革命,從 GitHub Copilot 到國產新秀的全面解析

目錄 引言 一、主流智能編碼工具深度測評:從功能到實戰 1. GitHub Copilot:AI 編碼的 “開山鼻祖” 核心特性與實戰代碼 優缺點總結 2. Baidu Comate:文心大模型加持的 “國產之光” 核心特性與實戰代碼 優缺點總結 3. 通義靈碼&…

Server 13 ,CentOS 上使用 Nginx 部署多個前端項目完整指南( 支持多端口與腳本自動化 )

目錄 前言 一、實際背景 1.1 并行部署 1.2 接口代理 1.3 刷新問題 二、安裝腳本 2.1 創建腳本 2.2 不同系統 2.3 執行完成 三、配置文件 3.1 配置文件 3.2 目錄結構 3.3 重新啟動 四、驗證訪問 五、問題排查 5.1 訪問 404 5.2 接口 502 六、本文總結 6.1 清理…

2025最新:徹底解決Docker拉取鏡像超時問題

文章目錄🐳 解決 Docker 拉取鏡像超時:context deadline exceeded 完整指南(2025 親測有效)🔥 問題描述🧩 根本原因分析? 解決方案匯總? 方案 1:配置多源鏡像加速器(推薦&#xff…

小鵬汽車 vla 算法最新進展和模型結構細節

小鵬汽車在 VLA(視覺 - 語言 - 動作)算法領域的最新進展和模型結構細節,體現了其在端到端智駕系統和車端大模型部署上的技術突破。以下是基于 2025 年 9 月最新公開信息的深度解析: 一、最新進展:全場景 VLA 系統量產落…

斐波那契數列推廣

目錄 問題: 法一: 法二: 例題: 問題: 已知斐波那契數列的第一個和最后一個數字,如何求整個數列(即第二個數字) 法一: 主要是將數列拆分成兩個數列的思想 法二: 暴力…

基于STM32設計的智慧路燈(華為云IOT)_281

文章目錄 一、前言 1.1 項目介紹 【1】項目開發背景 【2】設計實現的功能 【3】項目硬件模塊組成 【4】設計意義 【5】國內外研究現狀 【6】摘要 1.2 設計思路 1.3 系統功能總結 1.4 開發工具的選擇 【1】設備端開發 【2】上位機開發 1.5 參考文獻 1.6 系統框架圖 1.7 系統原理…

實驗十 合理定義分布列實現性能優化-分布式表關聯

實驗介紹本實驗通過分析普通查詢過程中存在的性能瓶頸點,通過執行計劃的分析找到可能的性能優化點并加以實施,最終達到優化的效果,重點關注分布式關聯相關查詢語句的優化。實驗目的了解通過合理定義分布列實現分布式關聯的性能優化。實驗步驟…

C#,RabbitMQ從入門到精通,.NET8.0(路由/分布式/主題/消費重復問題 /延遲隊列和死信隊列/消息持久化 )/RabbitMQ集群模式

為什么使用消息隊列 消息隊列(MQ)在分布式系統中用于解耦生產者和消費者,提高系統的異步處理能力、削峰填谷、增強可擴展性和可靠性。通過消息隊列,任務可以異步執行,避免系統因瞬時高并發而崩潰。 消息隊列場景 異…

OpenHarmony之SELinux安全組件底層原理設計架構精講

1. 組件介紹 1.1 核心功能 **SELinux(安全增強式Linux)**是Linux歷史上杰出的安全組件,包含一組內核修改和用戶空間工具,并提供了基于安全策略的強制訪問控制機制(Mandatory Access Control,MAC)。本部件負責對文件、屬性、服務等系統資源提供強制訪問控制保護,提供n…

IIS 部署 asp.net core 項目時,出現500.19、500.31問題的解決方案

目錄 (一)500.19 問題 1. 問題說明 2. 原因 3. 解決 (二)500.31 問題 1. 問題說明 2. 原因 打開事件檢視器的3種方式: 3. 解決 (一)500.19 問題 1. 問題說明 2. 原因 Web項目發布時&am…

中大型水閘安全監測的重要性及實施方法

水閘作為水利工程體系中的關鍵性構筑物,其結構安全性和運行可靠性直接影響到整個水利系統的穩定運行,更與下游地區人民群眾的生命財產安全息息相關。作為水利樞紐工程的重要控制節點,水閘承擔著防洪排澇、灌溉供水、航運發電等多重功能&#…

【芯片設計-信號完整性 SI 學習 1.1.1 -- Unit Interval,比特周期】

文章目錄1. Unit Interval (UI) / 比特周期 的定義2. 舉例說明3. 在眼圖 (Eye Diagram) 中的體現4. 示意圖(a) 單比特周期(b) 不同速率下的 UI(c) 眼圖中的 UI5. 總結1. Unit Interval (UI) / 比特周期 的定義 在高速信號傳輸與 信號完整性 (SI) 測試中,Unit Inter…

Go語言開發工具全解析

Go 語言的開發工具生態對于提高開發效率、保證代碼質量和團隊協作至關重要。一套完善的工具鏈可以幫助開發者:1. 加速編碼過程代碼模板快速生成常見模式例如使用代碼片段(Snippet)快速生成HTTP服務框架自動生成測試用例模板實時語法檢查減少錯誤即時顯示類型不匹配錯…

[郵件服務器core] 安全通信(SSL/TLS) | OpenSSL庫管理 | 服務端安全SECURITY.md

第5章:安全通信(SSL/TLS) 歡迎回來 在第4章:服務運行中,我們學習了如何啟動Dovecot郵件服務器并使其運行。 現在,我們的服務器已經啟動并準備好處理電子郵件,但有一個關鍵問題:我…

Lodash方法總結

目錄 1. _.defaults()為對象填充默認值 基本語法 功能說明 示例代碼 注意事項 與其他類似方法的區別 2. _.pickBy()刪除對象中值為空串或 null 的屬性 實現方法 代碼說明 擴展:深層過濾 3._.omitBy()移除滿足條件的屬性 基本語法 核心功能 示例代碼 1…

C#---Expression(表達式)

前言:Expression 是C# 高級編程,表達式的應用場景有 ORM框架:Entity Framework,Dapper等,規則引擎:動態業務規則評估, 依賴注入:高級DI容器實現,測試框架:模擬…

Lodash-es 完整開發指南:ES模塊化JavaScript工具庫實戰教程

簡介 Lodash-es 是 Lodash 庫的 ES 模塊版本,提供了大量實用的 JavaScript 工具函數。它支持按需導入,可以顯著減少打包體積,是現代 JavaScript 項目中的首選工具庫。 主要特性 ES 模塊支持: 完全支持 ES6 模塊語法按需導入: 只導入需要的…

26. AI-Agent-Dify

文章目錄前言一、Dify入門為什么使用 Dify?Dify 能做什么?二、Dify私有化部署Docker Compose 部署前提條件克隆 Dify 代碼啟動 Dify更新 Dify訪問 Dify自定義配置三、Dify構建企業級Agent應用定義如何使用智能助手添加助手需要的工具配置 Agent配置對話開…

云原生:微服務與Serverless指南

Copilot時代的開發者效能提升 代碼生成與補全:減少重復性編碼工作,加快開發速度錯誤檢測與修復:實時提示潛在問題,降低調試時間知識獲取與學習:幫助開發者快速掌握新語言或框架協作效率:通過AI輔助減少團隊…

SpringBoot + Apache Tika:一站式解決文件數據提取難題

在日常開發中,你是否也遇到過這樣的窘境:領導甩來需求“把用戶上傳的 Word、Excel、PDF 里的關鍵信息扒出來存庫”,你卻要對著不同格式逐個攻堅——解析 Word 用 POI 還要處理 .doc/.docx 兼容,解析 Excel 要啃合并單元格、公式計…