题目描述
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
暴力求解:
先从头到尾遍历,新建一个random指针都为空的链表。用两个list分别按顺序存放两个链表所有的节点。
然后再从头到尾遍历,按照原始链表的random在list的位置,给新链表中各个节点的random赋引用。
class Solution:
# 返回 RandomListNode
def Clone(self, pHead):
if not pHead:
return None
node = RandomListNode(pHead.label)
head = node
pHead_s = pHead
nodes = [pHead]
nodes_copy = [node]
pHead = pHead.next
while pHead:
node.next = RandomListNode(pHead.label)
node = node.next
nodes.append(pHead)
nodes_copy.append(node)
pHead = pHead.next
head_s = head
while pHead_s:
if pHead_s.random:
head_s.random = nodes_copy[nodes.index(pHead_s.random)]
pHead_s = pHead_s.next
head_s = head_s.next
return head
优化:
上面暴力的时间复杂度为O(n^2),空间复杂度为O(n)
看了牛客上的一个答案,时间复杂度为O(n), 空间复杂度为O(1)
class Solution:
def Clone(self, pHead):
pHead_s = pHead
while pHead_s:
temp = pHead_s.next
pHead_s.next = RandomListNode(pHead_s.label)
pHead_s.next.next = temp
pHead_s = pHead_s.next.next
pHead_s = pHead
while pHead_s:
if pHead_s.random:
pHead_s.next.random = pHead_s.random.next
pHead_s = pHead_s.next.next
pHead_s = pHead
head_s = pHead_s.next
head = head_s
while head_s.next:
pHead_s.next = pHead_s.next.next
head_s.next = head_s.next.next
pHead_s = pHead_s.next
head_s = head_s.next
return head