生活随笔
收集整理的這篇文章主要介紹了
LeetCode 138 复制带随机指针的链表
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題目描述
給定一個(gè)鏈表,每個(gè)節(jié)點(diǎn)包含一個(gè)額外增加的隨機(jī)指針,該指針可以指向鏈表中的任何節(jié)點(diǎn)或空節(jié)點(diǎn)。
要求返回這個(gè)鏈表的 深拷貝。
我們用一個(gè)由 n 個(gè)節(jié)點(diǎn)組成的鏈表來(lái)表示輸入
/輸出中的鏈表。每個(gè)節(jié)點(diǎn)用一個(gè)
[val
, random_index
]
表示:
val:一個(gè)表示 Node
.val 的整數(shù)。
random_index:隨機(jī)指針指向的節(jié)點(diǎn)索引(范圍從
0 到 n
-1);如果不指向任何節(jié)點(diǎn),則為 null 。
題解
參考鏈接:https
://leetcode
-cn
.com
/problems
/copy
-list
-with
-random
-pointer
/solution
/liang
-chong
-shi
-xian
-tu
-jie
-138-fu
-zhi
-dai
-sui
-ji
-/
1. 時(shí)間O(N),空間O(N)
2. 時(shí)間O(N),空間O(
1)
3. 時(shí)間O(N),空間O(N)
代碼
class Solution {
public:Node
* copyRandomList(Node
* head
) {if (!head
) return NULL;map
<Node
*,Node
*> mymap
;Node
* p
=head
;while (p
){Node
* tmp
=new Node(0);mymap
[p
]=tmp
;p
=p
->next
;}for (auto m
:mymap
){m
.second
->val
=m
.first
->val
;m
.second
->random
=mymap
[m
.first
->random
];m
.second
->next
=mymap
[m
.first
->next
];}return mymap
[head
];}
};
class Solution {
public:Node
* copyRandomList(Node
* head
) {if (!head
) return NULL;Node
* p
=head
;while (p
){Node
* tmp
=new Node(p
->val
);tmp
->next
=p
->next
;p
->next
=tmp
;p
=tmp
->next
;}p
=head
;while (p
){if (p
->random
) p
->next
->random
=p
->random
->next
;else p
->next
->random
=NULL;p
=p
->next
->next
;}Node
* node
=new Node(-1),*q
=node
;p
=head
;while (p
){q
->next
=p
->next
;q
=q
->next
;p
->next
=q
->next
;p
=p
->next
;}return node
->next
;}
};
說(shuō)明
1. 我們可以使用哈希表,建立鏈表中每個(gè)節(jié)點(diǎn)與深拷貝之后相應(yīng)節(jié)點(diǎn)之間的映射關(guān)系,之后為其賦值,val
的值相等,next的值即為原鏈表next節(jié)點(diǎn)在map中的對(duì)應(yīng)節(jié)點(diǎn),random的值也為原鏈表random節(jié)點(diǎn)在map中
的對(duì)應(yīng)節(jié)點(diǎn)。
2. 我們可以不必使用哈希表來(lái)建立映射關(guān)系,在原鏈表中的每個(gè)節(jié)點(diǎn)后插入和其值相同的節(jié)點(diǎn),這樣相鄰兩個(gè)
節(jié)點(diǎn)就建立了對(duì)應(yīng)關(guān)系,節(jié)點(diǎn)的random值為其原節(jié)點(diǎn)random的next節(jié)點(diǎn),最后再把拷貝之后的鏈表抽出來(lái)即
可。
3. 將其視作圖來(lái)進(jìn)行深度優(yōu)先搜索。
總結(jié)
以上是生活随笔為你收集整理的LeetCode 138 复制带随机指针的链表的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。