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個函數。有了這些清晰的思路之後再寫代碼,就容易多了;
- 考查分析時間效率和空間效率的能力。當提出第一種第二種思路的時候,此時算法在效率上還不是最優解。這時候要能自己分析出這兩種算法的時間複雜度和空間複雜度各是多少。