日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

链表中环的入口结点

發布時間:2023/12/20 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 链表中环的入口结点 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

解題描述

方法1 - 哈希法,需要額外空間

1、遍歷單鏈表的每個結點
2、如果當前結點地址沒有出現在set中,則存入set中
3、否則,出現在set中,則當前結點就是環的入口結點
4、整個單鏈表遍歷完,若沒出現在set中,則不存在環

public class Solution {public ListNode EntryNodeOfLoop(ListNode pHead){ListNode pos = pHead;// 哈希表記錄訪問過的結點Set<ListNode> visited = new HashSet<ListNode>();while (pos != null) {// 判斷結點是否被訪問if (visited.contains(pos)) {return pos;} else {// 結點記錄添加到哈希表中visited.add(pos);}// 遍歷pos = pos.next;}return null;}

時間復雜度O(N):其中 N 為鏈表中節點的數目。遍歷整個鏈表的結點
空間復雜度O(N):其中 N 為鏈表中節點的數目。我們需要將鏈表中的每個節點都保存在哈希表當中。

方法2 - 雙指針,不需要額外空間

我們使用兩個指針,fast 與 slow。
1、它們起始都位于鏈表的頭部。隨后,slow 指針每次向后移動一個位置,而fast 指針向后移動兩個位置。如果鏈表中存在環,則 fast 指針最終將再次與 slow 指針在環中相遇。
2、當發現 slow 與 fast 相遇時,我們再額外使用一個指針 cur。起始,它指向鏈表頭部;隨后,它和 slow 每次向后移動一個位置。最終,它們會在入環點相遇

會在節點5相遇。

圖解:

分析:
這其實是一道數學題。


1、初始化:快指針fast指向頭結點, 慢指針slow指向頭結點
2、讓fast一次走兩步, slow一次走一步,第一次相遇在C處,停止
3、然后讓fast指向頭結點,slow原地不動,讓后fast,slow每次走一步,當再次相遇,就是入口結點。
如上解釋:

如果慢指針slow第一次走到了B點處,距離C點處還有距離Y,那么fast指針應該停留在D點處,且BD距離為Y(圖中所示是假設快指針走了一圈就相遇,為了便于分析),
也就是DB+BC=2Y,(因為fast一次走2步,慢指針一次走1步,并且相遇在C處)
在C點處,此時慢指針slow走的點為ABC,距離為X+Y,而快指針fast走的點為ABCDBC,距離為慢指針的2倍,也就是2X+2Y,
又因為:AB=X,BC=Y,快指針走了2次BC,所以CDB距離為X,而AB距離也為X。
所以,額外搞一個cur指針從頭觸發,與滿指針一起,那么相遇的點就是B點,因為走過的距離為CDB,也就是AB。

public ListNode EntryNodeOfLoop(ListNode pHead) {if (pHead == null || pHead.next == null)return null;ListNode slow = pHead, fast = pHead;do {fast = fast.next.next;slow = slow.next;} while (slow != fast);ListNode cur = pHead;while (slow != cur) {slow = slow.next;cur = cur.next;}return cur; }

時間復雜度O(N):其中 N 為鏈表中節點的數目。在最初判斷快慢指針是否相遇時,slow 指針走過的距離不會超過鏈表的總長度;隨后尋找入環點時,走過的距離也不會超過鏈表的總長度
空間復雜度O(1):額外使用的指針占用常數空間

總結

以上是生活随笔為你收集整理的链表中环的入口结点的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。