Python解法
1)根据next指针,复制每个结点,放在原结点后面;2)复制random指针;3)分裂为新老两个链表。
# -*- coding:utf-8 -*-
# class RandomListNode:
# def __init__(self, x):
# self.label = x
# self.next = None
# self.random = None
class Solution:
# 返回 RandomListNode
def Clone(self, pHead):
def CloneNode(pHead):
cur = pHead
while cur != None:
newNode = RandomListNode(cur.label)
newNode.next = cur.next
newNode.random = None
cur.next = newNode
cur = newNode.next
def ConnectSiblingNodes(pHead):
cur = pHead
while cur != None:
newNode = cur.next
if cur.random != None:
newNode.random = cur.random.next
cur = newNode.next
def ReconnectNodes(pHead):
cur = pHead
res = None
newNode = None
if cur != None:
res = newNode = cur.next
cur.next = newNode.next
cur = cur.next
while cur != None:
newNode.next = cur.next
newNode = newNode.next
cur.next = newNode.next
cur = cur.next
return res
CloneNode(pHead)
ConnectSiblingNodes(pHead)
return ReconnectNodes(pHead)
考点
- 考查对复杂问题的思维能力。本题中的复杂链表是一种不太常见的数据结构,而且复制这种链表的过程也较为复杂。我们把复杂链表的复制过程分解成3个步骤,同时把每个步骤都用图形化的方式表示出来,这样能帮助我们厘清思路。在写代码的时候,我们为每个步骤定义一个子函数,最后在复制函数中先后调用这3个函数。有了这些清晰的思路之后再写代码,就容易多了;
- 考查分析时间效率和空间效率的能力。当提出第一种第二种思路的时候,此时算法在效率上还不是最优解。这时候要能自己分析出这两种算法的时间复杂度和空间复杂度各是多少。