尝试先顺序拷贝原来的链表,不加随机指针,然后再遍历一次,加上随机指针,超时。。。
# Definition for singly-linked list with a random pointer.
# class RandomListNode:
# def __init__(self, x):
# self.label = x
# self.next = None
# self.random = None
class Solution:
# @param head: A RandomListNode
# @return: A RandomListNode
def copyRandomList(self, head):
# write your code here
if head == None:
return head
p1 = head.next
a_head = RandomListNode(head.label)
p2 = a_head
while p1:
p2.next = RandomListNode(p1.label)
p2 = p2.next
p1 = p1.next
p1 = head
p2 = a_head
while p1:
p3 = a_head
if p1.random != None:
tmp = p1.random.label
while p3.label != tmp:
p3 = p3.next
p2.random = p3
p2 = p2.next
p1 = p1.next
else:
p2.random = None
p2 = p2.next
p1 = p1.next
return a_head
然后看了这篇博客,Good idea
# Definition for singly-linked list with a random pointer.
# class RandomListNode:
# def __init__(self, x):
# self.label = x
# self.next = None
# self.random = None
class Solution:
# @param head: A RandomListNode
# @return: A RandomListNode
def copyRandomList(self, head):
# write your code here
if head == None:
return head
p1 = head
while p1:
p2 = RandomListNode(p1.label)
p2.next = p1.next
p2.random = p1.random
p1.next = p2
p1 = p2.next
a_head = head.next
p1 = a_head
while p1.next:
if p1.random:
p1.random = p1.random.next
else:
p1.random = None
p1.next = p1.next.next
p1 = p1.next
return a_head