Hard-テーマ20:138.Copy List with Random Pointer
1885 ワード
タイトル原文:A linked list is given such that each node contains an additional random pointer which could point to any node in the list or null.
Return a deep copy of the list. 深さは1つのチェーンテーブルをコピーして、このチェーンテーブルは普通の単鎖テーブルの基礎の上で1つのrandomポインタを増加して、チェーンテーブルのいかなる1つのノードを指すことができて、だからランダムなチェーンテーブルと呼ばれます.テーマ分析:元のチェーンテーブルを2回遍歴するには、randomノードを持たずに元のチェーンテーブルをコピーし、ハッシュテーブルで元のチェーンテーブルと新しいチェーンテーブルのマッピング関係を確立します.元のチェーンテーブルのi番目のノードはkeyで、新しいチェーンテーブルのi番目のノードはvalueです(なぜ逆さまにできないのか考えてみてください).2回目のスキャン時にrandomノードをコピーし、元のチェーンテーブルと新しいチェーンテーブルを同時に最初からスキャンし、新しいチェーンテーブルの現在のノードのrandom値を元のチェーンテーブルrandomのハッシュテーブルでのマッピングに等しくします.総複雑度O(n).ソース:(language:cpp)
成績:128 ms,beats 19.31%,衆数108 ms,19.45%Cmershenの砕けた考え:最初はハッシュテーブルでチェーンテーブルの各ノードを[1,length]にマッピングし,次にrandomを持たないものを複製し,2回目は並列に2つのチェーンテーブルを掃き,元のrandomが指す「下付き」を得て,新しいチェーンテーブルの中で最初から探し始めた.しかし,このような時間的複雑さはO(n 2)であり,望ましくない.
Return a deep copy of the list. 深さは1つのチェーンテーブルをコピーして、このチェーンテーブルは普通の単鎖テーブルの基礎の上で1つのrandomポインタを増加して、チェーンテーブルのいかなる1つのノードを指すことができて、だからランダムなチェーンテーブルと呼ばれます.テーマ分析:元のチェーンテーブルを2回遍歴するには、randomノードを持たずに元のチェーンテーブルをコピーし、ハッシュテーブルで元のチェーンテーブルと新しいチェーンテーブルのマッピング関係を確立します.元のチェーンテーブルのi番目のノードはkeyで、新しいチェーンテーブルのi番目のノードはvalueです(なぜ逆さまにできないのか考えてみてください).2回目のスキャン時にrandomノードをコピーし、元のチェーンテーブルと新しいチェーンテーブルを同時に最初からスキャンし、新しいチェーンテーブルの現在のノードのrandom値を元のチェーンテーブルrandomのハッシュテーブルでのマッピングに等しくします.総複雑度O(n).ソース:(language:cpp)
class Solution {
public:
RandomListNode *copyRandomList(RandomListNode *head) {
map<RandomListNode *,RandomListNode *> m;
m[NULL]=NULL;
RandomListNode *t=new RandomListNode(0);
RandomListNode *p1=head,*p2=t;
while(p1)
{
p2->next=new RandomListNode(p1->label);
m[p1]=p2->next;
p1=p1->next;
p2=p2->next;
}
p1=head;
p2=t->next;
while(p1)
{
p2->random=m[p1->random];
p1=p1->next;
p2=p2->next;
}
p2=t->next;
return p2;
}
};
成績:128 ms,beats 19.31%,衆数108 ms,19.45%Cmershenの砕けた考え:最初はハッシュテーブルでチェーンテーブルの各ノードを[1,length]にマッピングし,次にrandomを持たないものを複製し,2回目は並列に2つのチェーンテーブルを掃き,元のrandomが指す「下付き」を得て,新しいチェーンテーブルの中で最初から探し始めた.しかし,このような時間的複雑さはO(n 2)であり,望ましくない.