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)