![](http://static.javashuo.com/static/loading.gif)
題目難度: 中等web
原題連接[1]算法
今天繼續更新劍指 offer 系列, 這道題實現起來並不難, 但須要必定的思考, 你們能夠先嚐試本身想一想如何解決微信
老樣子晚上 6 點 45 分準時更新公衆號 每日精選算法題, 你們記得關注哦~ 另外在公衆號裏回覆 offer 就能看到劍指 offer 系列當前連載的全部文章了dom
題目描述
請實現 copyRandomList 函數,複製一個複雜鏈表。在複雜鏈表中,每一個節點除了有一個 next 指針指向下一個節點,還有一個 random 指針指向鏈表中的任意節點或者 null。編輯器
-
-10000 <= Node.val <= 10000 -
Node.random 爲空(null)或指向鏈表中的節點。 -
節點數目不超過 1000 。
題目樣例
示例
輸入
![](http://static.javashuo.com/static/loading.gif)
head = [[7,null],[13,0],[11,4],[10,2],[1,0]]函數
輸出
[[7,null],[13,0],[11,4],[10,2],[1,0]]flex
題目思考
-
如何處理 random 指針?
解決方案
思路
-
若是隻有 next 指針的話很簡單, 咱們只須要對每一個節點新建一個相同值的節點, 並保持指向關係, 逐個遍歷過去便可 -
如今多了個 random 指針, 想要定位新的指向的節點, 一個比較天然的想法就是額外維護一個老節點到新節點的映射關係, 能夠用字典來實現 -
第一遍遍歷, 就只關注 next 部分, 並創建好映射關係 -
第二遍遍歷, 考慮 random 部分, 找到對應的新鏈表的節點, 而後當前節點的 random 指針指向它便可
複雜度
-
時間複雜度 O(N)
-
每一個節點只須要遍歷兩次 -
空間複雜度 O(N)
-
額外須要一個字典
代碼
class Solution:
def copyRandomList(self, head: 'Node') -> 'Node':
if not head:
return None
maps = {}
# 第一遍遍歷, 創建新的鏈表, 以及老節點到新節點的映射關係
copyHead = Node(head.val)
origin, copy = head, copyHead
maps[origin] = copy
while origin.next:
# 新建下一個節點, 並創建next關係
copy.next = Node(origin.next.val)
origin = origin.next
copy = copy.next
maps[origin] = copy
# 第二遍遍歷, 處理random指針部分
origin, copy = head, copyHead
while origin:
if origin.random:
# 若是老節點random指針指向非空的話, 就將當前新節點也指向隨機節點對應的新節點
copy.random = maps[origin.random]
origin = origin.next
copy = copy.next
return copyHead
參考資料
原題連接: https://leetcode-cn.com/problems/fu-za-lian-biao-de-fu-zhi-lcof/spa
![](http://static.javashuo.com/static/loading.gif)
![](http://static.javashuo.com/static/loading.gif)
![](http://static.javashuo.com/static/loading.gif)
![](http://static.javashuo.com/static/loading.gif)
本文分享自微信公衆號 - 每日精選算法題(DailyAlgorithm)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。.net