138. Copy List with Random Pointer

Posted Premiumlab

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了138. Copy List with Random Pointer相关的知识,希望对你有一定的参考价值。

https://leetcode.com/problems/copy-list-with-random-pointer/#/description

 

 

A linked list is given such that each node contains an additional random pointer which could point to any node in the list or null.

Return a deep copy of the list.

 

 

Sol 1:

 

# Definition for singly-linked list with a random pointer.
# class RandomListNode(object):
#     def __init__(self, x):
#         self.label = x
#         self.next = None
#         self.random = None

class Solution(object):
    def copyRandomList(self, head):
        """
        :type head: RandomListNode
        :rtype: RandomListNode
        """
        # Time O(2n) Space O(1) 

        dic = dict()
        m = n = head
        
        # m is to copy label data structure, one pass. Time O(n) 
        while m:
            dic[m] = RandomListNode(m.label)
            m = m.next
        # n is to copy next and random data structure. one pass. Time O(n)
        while n:
            dic[n].next = dic.get(n.next)
            dic[n].random = dic.get(n.random)
            n = n.next
        return dic.get(head)

 

 

Note:

 

1 In the initlization of a linked list, 

 

self.label = x

 

"label" here mean value.... it‘s a name, does not matter

 

 

 

 

 

 

Sol 2:

 

# Definition for singly-linked list with a random pointer.
# class RandomListNode(object):
#     def __init__(self, x):
#         self.label = x
#         self.next = None
#         self.random = None

import collections
class Solution(object):
    def copyRandomList(self, head):
        """
        :type head: RandomListNode
        :rtype: RandomListNode
        """
        # Time O(n) Space O(1) 

        # Nice lambda initlization here. Pythonic
        dic = collections.defaultdict(lambda : RandomListNode(0))
        dic[None] = None
        
        n = head

        while n:
            dic[n].label = n.label
            dic[n].next = dic[n.next]
            dic[n].random = dic[n.random]
            n = n.next
        return dic.get(head)

 

以上是关于138. Copy List with Random Pointer的主要内容,如果未能解决你的问题,请参考以下文章

138. Copy List with Random Pointer

138. Copy List with Random Pointer

138 Copy List with Random Pointer

138. Copy List with Random Pointer

138. Copy List with Random Pointer(js)

138. Copy List with Random Pointer