1. 程式人生 > 其它 >LeetCode初級演算法之連結串列:141 環形連結串列

LeetCode初級演算法之連結串列:141 環形連結串列

技術標籤:連結串列演算法javaleetcode單鏈表



01

題目資訊

題目地址:

https://leetcode-cn.com/problems/linked-list-cycle/

給定一個連結串列,判斷連結串列中是否有環。

  • 如果連結串列中有某個節點,可以通過連續跟蹤 next 指標再次到達,則連結串列中存在環。為了表示給定連結串列中的環,我們使用整數 pos 來表示連結串列尾連線到連結串列中的位置(索引從 0 開始)。如果 pos 是 -1,則在該連結串列中沒有環。注意:pos 不作為引數進行傳遞,僅僅是為了標識連結串列的實際情況。

  • 如果連結串列中存在環,則返回 true 。否則,返回 false 。

進階:

你能用 O(1)(即,常量)記憶體解決此問題嗎?

示例 1:

b025dfaf-5319-40c5-8f1a-4818acc03310.png
輸入:head =[3,2,0,-4], pos = 1
輸出:true
解釋:連結串列中有一個環,其尾部連線到第二個節點。

示例 2:

bb67cc8b-af8d-45a9-8830-a8cc90efdb9e.png
輸入:head =[1,2], pos =0
輸出:true
解釋:連結串列中有一個環,其尾部連線到第一個節點。

示例 3:

a957e4b1-1b09-40f1-9d4f-d60e17163539.png
輸入:head =[1], pos =-1
輸出:false
解釋:連結串列中沒有環。

提示:

連結串列中節點的數目範圍是 [0, 104] -105 <= Node.val <= 105 pos 為 -1 或者連結串列中的一個 有效索引 。



02

解法一:快慢指標


這題成環問題直接就聯想想到快慢指標,一條道兩個人跑步一快一慢,如果沒環則永遠不會追上,有環則會相遇。大概如下(慢的走一步、快的走兩步):

f82c6872-e7cc-4de5-b165-e09fdca40bde.gif

程式碼如下:

publicbooleanhasCycle(ListNodehead){
ListNodeslow=head;
ListNodefast=head;
while(fast!=null&&fast.next!=null){
//出發點相同所以先走再判斷是否相等
slow=slow.next;
fast=fast.next.next;
if(slow.equals(fast)){
returntrue;
}
}
returnfalse;
}



03

解法二:hash表


快慢指標當然是最優的,但還是可以熟悉一下其他容器。和前面一樣用容器存判斷是否成環的條件即在不停的next不停的存的過程中出現了存的節點之前存過。那麼可以hashmap計數但只判斷是否出現兩次所以用set就行

publicbooleanhasCycle(ListNodehead){
Set<ListNode>set=newHashSet();
while(head!=null){
//存到重複返回
if(!set.add(head))returntrue;
head=head.next;
}
returnfalse;
}



04

總結


初級演算法合集中的連結串列篇章也結束,總體來說一共六題都確實比較簡單可能需要熟悉和思考的點就是通過雙指標的連結串列操作完成各種場景的定位。美滿c5a95572-8d17-467f-9eff-bfb623270261.pngc5a95572-8d17-467f-9eff-bfb623270261.pngc5a95572-8d17-467f-9eff-bfb623270261.png下一篇開始樹的相關演算法。


本文分享自微信公眾號 - IT那個小筆記(qq1839646816)。
如有侵權,請聯絡 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。