【力扣】138:複製帶隨機指針的鏈表 | 面試35 | 深拷貝

題目描述

給定一個鏈表,每個節點包含一個額外增加的隨機指針,該指針可以指向鏈表中的任何節點或空節點。

要求返回這個鏈表的 深拷貝

我們用一個由 n 個節點組成的鏈表來表示輸入/輸出中的鏈表。每個節點用一個 [val, random_index] 表示:
val:一個表示 Node.val 的整數。
random_index:隨機指針指向的節點;如果不指向任何節點,則爲 null 。

class Node:
    def __init__(self, x: int, next: 'Node' = None, random: 'Node' = None):
        self.val = int(x)
        self.next = next
        self.random = random

來源:力扣(LeetCode)

算法思路

因爲是深拷貝,所以不能使用某個節點然後指向原有節點。

如何深拷貝?重新創建節點值和節點關係與原鏈表相同的鏈表。

class Solution:
    def copyRandomList(self, head: 'Node') -> 'Node':
        d={None:None}
        ad=head
        while ad:
            d[ad]=Node(ad.val)
            ad=ad.next
        ad=head
        # print(d)
        # return
        try:
            while ad:
                d[ad].next=d[ad.next]
                # if ad.random==None:
                    # d[ad].random=None
                # else:
                d[ad].random=d[ad.random]
                # print(ad.val)
                ad=ad.next
            return d[head]
        except Exception as err:
            print(err)

完整算法多次出錯,後來通過try-except與print找到錯誤是None不在字典裏。

算法第一部分,先遍歷一遍鏈表並創建映射,記得保存原表頭head。
!一個重要的點是這裏作爲key的節點是可以修改的嗎?實踐證明可以。即使修改了key的屬性,也不影響。

		d={None:None}
        ad=head
        while ad:
            d[ad]=Node(ad.val)
            ad=ad.next

第二部分是根據鏈表對新創建的節點進行關聯。

            while ad:
                d[ad].next=d[ad.next]
                d[ad].random=d[ad.random]
                ad=ad.next

完成。

class Solution:
    def copyRandomList(self, head: 'Node') -> 'Node':
        d={None:None}
        k=head
        while k:
            d[k]=Node(k.val)
            k=k.next
        k=head
        while k:
            d[k].next=d[k.next]
            d[k].random=d[k.random]
            k=k.next
        return d[head]

執行用時 :44 ms, 在所有 Python3 提交中擊敗了71.11%的用戶
內存消耗 :14.3 MB, 在所有 Python3 提交中擊敗了11.11%的用戶

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章