劍指 Offer 35. 複雜鏈表的複製 - leetcode 劍指offer系列

點擊專輯上方「藍字」關注我吧


題目難度: 中等web

原題連接[1]算法

今天繼續更新劍指 offer 系列, 這道題實現起來並不難, 但須要必定的思考, 你們能夠先嚐試本身想一想如何解決微信

老樣子晚上 6 點 45 分準時更新公衆號 每日精選算法題, 你們記得關注哦~ 另外在公衆號裏回覆 offer 就能看到劍指 offer 系列當前連載的全部文章了dom

題目描述

請實現 copyRandomList 函數,複製一個複雜鏈表。在複雜鏈表中,每一個節點除了有一個 next 指針指向下一個節點,還有一個 random 指針指向鏈表中的任意節點或者 null。編輯器

  • -10000 <= Node.val <= 10000
  • Node.random 爲空(null)或指向鏈表中的節點。
  • 節點數目不超過 1000 。

題目樣例

示例

輸入

head = [[7,null],[13,0],[11,4],[10,2],[1,0]]函數

輸出

[[7,null],[13,0],[11,4],[10,2],[1,0]]flex

題目思考

  1. 如何處理 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

參考資料

[1]

原題連接: https://leetcode-cn.com/problems/fu-za-lian-biao-de-fu-zhi-lcof/spa

你的每一個贊和在看,我都喜歡!

本文分享自微信公衆號 - 每日精選算法題(DailyAlgorithm)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。.net

相關文章
相關標籤/搜索