力扣 138 複製帶隨機指標的鍊錶 鍊錶 雜湊

2021-10-23 10:45:52 字數 1802 閱讀 8815

思路一:首先忽略ran

do

mrandom

random

指標,遍歷給定鍊錶h

1h_1

h1​,同時建立出它的深拷貝h

2h_2

h2​,並建立從h

1h_1

h1​到h

2h_2

h2​的對映。然後我們再次遍歷鍊錶h

1h_1

h1​,有了對映關係,就可以修改ran

do

mrandom

random

指標了。

/*

// definition for a node.

class node

};*/

class

solution

cur1=myhead.next;

cur2=head;

while

(cur2)

return myhead.next;}}

;

思路二:和思路一一樣,但是我們可以一步到位,無需遍歷h

1h_1

h1​兩遍。

/*

// definition for a node.

class node

};*/

class

solution

cur1=cur1-

>next;if(

!cur2-

>random)

//處理random指標

if(m.

find

(cur2-

>random)

!=m.

end())

cur1-

>random=m[cur2-

>random]

;else

cur2=cur2-

>next;

}return myhead.next;}}

;

思路三:這個思路相當巧妙,可以做到o(1

)o(1)

o(1)

的空間複雜度。先遍歷一遍h

1h_1

h1​,每個節點進行自我複製,並將其連線到自己後面,比如:a

−>b−

>

ca->b->c

a−>b−

>

c,經過這次操作後就變成了a

−>a−

>b−

>b−

>c−

>

ca->a->b->b->c->c

a−>a−

>b−

>b−

>c−

>

c;再遍歷一遍h

1h_1

h1​,這個時候處理ran

do

mrandom

random

指標就比較容易了;最後遍歷一遍h

1h_1

h1​,將其拆分成兩個鍊錶即可。

/*

// definition for a node.

class node

};*/

class

solution

cur=head;

//處理random指標

while

(cur)

node ans(0

),*pre=

&ans;

cur=head;

while

(cur)

return ans.next;}}

;

138 複製帶隨機指標的鍊錶

給定乙個鍊錶,每個節點包含乙個額外增加的隨機指標,該指標可以指向鍊錶中的任何節點或空節點。要求返回這個鍊錶的深度拷貝。definition for singly linked list with a random pointer.struct randomlistnode class solutio...

138 複製帶隨機指標的鍊錶

138.複製帶隨機指標的鍊錶 回溯演算法的第一想法是將鍊錶想象成一張圖。鍊錶中每個節點都有2個指標 圖中的邊 因為隨機指標給圖結構新增了隨機性,所以我們可能會訪問相同的節點多次,這樣就形成了環 上圖中,我們可以看到隨機指標指向了前乙個節點,因此形成了環。我們需要考慮這種環的實現。此方法中,我們只需要...

138 複製帶隨機指標的鍊錶

題目 給定乙個鍊錶,每個節點包含乙個額外增加的隨機指標,該指標可以指向鍊錶中的任何節點或空節點。要求返回這個鍊錶的 深拷貝。我們用乙個由 n 個節點組成的鍊錶來表示輸入 輸出中的鍊錶。每個節點用乙個 val,random index 表示 val 乙個表示 node.val 的整數。random i...