牛客 劍指offer系列題解 複雜鍊錶的複製

2021-10-05 09:05:54 字數 2600 閱讀 9049

記錄刷題的過程。牛客和力扣中都有相關題目,這裡以牛客的題目描述為主。該系列預設採用python語言。

1、問題描述:

輸入乙個複雜鍊錶(每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點),返回結果為複製後複雜鍊錶的head。(注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空)

2、資料結構:

鍊錶3、題解:

方法1:dfs

# -*- coding:utf-8 -*-

# class randomlistnode:

# def __init__(self, x):

# self.label = x

# self.next = none

# self.random = none

class

solution

:# 返回 randomlistnode

defclone

(self, phead)

:# write code here

#判斷,空返回空

defdfs

(head)

:if head ==

none

:return

none

if head in visited:

return visited[head]

ptem = randomlistnode(head.label)

visited[head]

= ptem

ptem.

next

= dfs(head.

next

) ptem.random = dfs(head.random)

return ptem

visited =

return dfs(phead)

方法2:

複製乙個一樣的node,並且新增到之前的鍊錶的每乙個node後面

實現新建的node的random的指向

斷開新node 和原來的node之間的鏈結

比如 a->b->c 變成 a->a』->b->b』->c->c』,然後將拷貝的結點分離出來變成 a->b->c和a』->b』->c』,最後返回 a』->b』->c』。

# -*- coding:utf-8 -*-

# class randomlistnode:

# def __init__(self, x):

# self.label = x

# self.next = none

# self.random = none

class

solution

:# 返回 randomlistnode

defclone

(self, phead)

:# write code here

#判斷,空返回空

if phead ==

none

:return

none

#複製乙個一樣的node,並且新增到之前的鍊錶的每乙個node後面

ptmp = phead

while ptmp:

node =randomlistnode(ptmp.label)

node.

next

= ptmp.

next

ptmp.

next

= node # 轉殖新結點在node 後面

ptmp = node.

next

# 移動到下乙個要轉殖的點

#實現新建的node的random的指向

ptmp = phead

while ptmp:

if ptmp.random:

ptmp.

next

.random = ptmp.random.

next

ptmp = ptmp.

next

.next

ptmp = phead

res = phead.

next

pnew = phead.

next

while ptmp:

ptmp.

next

= ptmp.

next

.next

if pnew.

next

: pnew.

next

= pnew.

next

.next

pnew = pnew.

next

ptmp = ptmp.

next

return res

4、複雜度分析:

方法1:

時間複雜度:o(n)

空間複雜度:o(n)

方法2:

時間複雜度:o(n)

空間複雜度:o(1)

牛客劍指offer 1 10題解

在乙個二維陣列中 每個一維陣列的長度相同 每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。class solution else continue 記憶體集體向右移兩個位元組 並置 0前兩個位元組 v...

牛客 劍指offer系列題解 最小的K個數

記錄刷題的過程。牛客和力扣中都有相關題目,這裡以牛客的題目描述為主。該系列預設採用python語言。1 問題描述 輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,2 資料結構 二叉樹,堆 3 題解 方法1 排序,取前k個數 co...

牛客 劍指offer系列題解 把陣列排成最小的數

記錄刷題的過程。牛客和力扣中都有相關題目,這裡以牛客的題目描述為主。該系列預設採用python語言。1 問題描述 輸入乙個正整數陣列,把陣列裡所有數字拼接起來排成乙個數,列印能拼接出的所有數字中最小的乙個。例如輸入陣列,則列印出這三個數字能排成的最小數字為321323。2 資料結構 陣列,字串,排序...