剑指Offer 35.复杂链表的复制
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
LeetCode 138.复制带随机指针的链表
给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。
要求返回这个链表的深拷贝。
解题思路
三步法
剑指Offer上的解法,具体步骤分为三步:
1.复制原始链表的任意节点N并创建新节点N‘,并将N’链接到N的后面;
2.第一步复制出来的节点没有random指针,如果原始节点N的random指针指向S节点,则对应的复制节点N‘的random指针指向S的复制节点S’;
3.将这个长链表拆分为两个链表。
时间复杂度
O
(
n
)
O(n)
O(n),空间复杂度
O
(
1
)
O(1)
O(1)。
class Solution:
# 返回 RandomListNode
def Clone(self, pHead):
# write code here
if not pHead: return pHead
self.cloneNode(pHead)
self.connetSiblingNodes(pHead)
return self.reconnectNodes(pHead)
def cloneNode(self,pHead):
pNode = pHead
while pNode:
pClone = RandomListNode(pNode.label)
pClone.next = pNode.next
pNode.next = pClone
pNode = pClone.next
def connetSiblingNodes(self,pHead):
pNode = pHead
while pNode:
pClone = pNode.next
if pNode.random:
pClone.random = pNode.random.next
pNode = pClone.next
def reconnectNodes(self,pHead):
pNode = pHead
if pNode:
pCloneHead = pCloneNode = pNode.next
pNode.next = pCloneNode.next
pNode = pNode.next
while pNode:
pCloneNode.next = pNode.next
pCloneNode = pCloneNode.next
pNode.next = pCloneNode.next
pNode = pNode.next
return pCloneHead
2019.7.24 补充LeetCode部分