專欄 | 九章演算法
網址 | www.jiuzhang.com
題目描述
給出一個連結串列,每個節點包含一個額外增加的隨機指標可以指向連結串列中的任何節點或空的節點。
返回一個深拷貝的連結串列。
演算法分析
深度拷貝一個普通連結串列的演算法非常簡單,因為每一個節點只有一個next指標指向下一個節點,整體上是一個線性結構;但是題目中的節點多了一個隨機指標,可以指向連結串列中的任何節點,或者是空的節點。所以在建立新的連結串列的時候,要考慮到隨機指標指向的節點是否已經被新建過了,是否已經存在於新連結串列中。
需要查重的時候,自然想到了雜湊表(雜湊表),所以每次新建一個節點時,都將原連結串列裡的節點和新的節點放入HashMap中,以原節點為鍵,新節點為值,這樣在複製next指標指向的節點、或者是random指標指向的節點時,都可以在O(1)的時間內在雜湊表中找到已經複製過並放入新連結串列中的新節點。這個演算法的時間複雜度是O(N),額外空間複雜度是O(N)。
使用雜湊表雖好,但是會佔用O(N)的額外空間,如果可以使用常數級別的額外空間就最好了。方法一中佔用空間的是新建的雜湊表HashMap,如果可以用別的方法將原節點與新節點聯絡起來,在O(1)的時間內可以找到對應的節點,就可以不使用雜湊表了。因為題目中已經告知隨機指標只會指向連結串列中的節點或者是空節點,對於這一特性,每次在建立新節點時,將新節點插入到舊連結串列中相應的節點後面,如舊連結串列1→2->3→4,在遍歷和插入之後就會變成1->1'->2->2'->3->3'->4->4';而第二次遍歷時將新節點裡的random指標指向舊節點random指標指向的節點的next,如果在連結串列1->1'->2->2'->3->3'->4->4'中,節點4的random指標指向了節點1,那麼就讓節點4的next (4')的random指向節點1的next (1');最後再遍歷連結串列,將新的節點都取出來,組成新的連結串列。這個演算法的時間複雜度是O(3N) = O(N),額外空間複雜度是O(1)。
參考程式
面試官角度分析
這道題目能夠分析清楚兩個不同思路的時間複雜度和空間複雜度就能夠拿到hire。
LintCode相關練習題
www.lintcode.com/en/problem/…
推薦閱讀:
- 網申時, 是否需要 cover letter (求職信) ?
- 2017年最受歡迎的程式語言有哪些?
- HR 揭祕: 10 個掛掉 Offer 的原因
- Google offer 如何談判?聽聽 Google recruiter 怎麼說!
- 面試遇到做過的題怎麼辦?
- Snapchat 面經 | LA 總部面試體驗
- 面試前如何瞭解一家IT企業?試試官方技術部落格!
- 網際網路歷史上最有創意的 7 份簡歷
- 利用 Twitter 找工作 | 如何尋找招聘資訊
- Facebook 電面+Onsite面經
歡迎關注我的微信公眾號:九章演算法(ninechapter)。
精英程式設計師交流社群,定期釋出面試題、面試技巧、求職資訊等