劍指 Offer 35. 複雜連結串列的複製 - 8月17日
阿新 • • 發佈:2020-08-17
題目
劍指 Offer 35. 複雜連結串列的複製
我的思路
遍歷兩次: 第一次根據next指標,建立並拷貝next鏈。 第二次根據已有next鏈從前向後遞進,依次查詢每個節點的random指向節點的位置,併為指標賦值。看起來第二次遍歷的時間複雜度較高,達到了n^2。也許可以藉助輔助儲存空間,以犧牲空間的代價換取效率的提升。在第一次遍歷時建造兩個雜湊表,1.新連結串列的(節點序號,該節點的指標)2.舊連結串列(節點的指標,序號)看了官方題解:其實還可以更簡練,用一個雜湊表儲存舊節點和新節點的對映即可!
我的實現
/* // Definition for a Node. class Node { public: int val; Node* next; Node* random; Node(int _val) { val = _val; next = NULL; random = NULL; } };*/ class Solution { public: Node* copyRandomList(Node* head) { Node* newhead = NULL; Node* oldtemp = NULL; Node* newtemp = NULL; unordered_map<int,Node*> NMAP; unordered_map<Node*,int> OMAP; //第一次遍歷:拷貝next鏈;在第一次遍歷時建造兩個雜湊表,1.新連結串列的(節點序號,該節點的指標)2.舊連結串列(節點的指標,序號)oldtemp = head; int no = 0; if(oldtemp!=NULL){ newhead = new Node(oldtemp->val); OMAP.insert(make_pair(oldtemp,no)); NMAP.insert(make_pair(no,newhead)); newtemp = newhead; no++; while(oldtemp->next!=NULL){ newtemp->next = new Node(oldtemp->next->val); OMAP.insert(make_pair(oldtemp->next,no)); NMAP.insert(make_pair(no,newtemp->next)); oldtemp = oldtemp->next; newtemp = newtemp->next; no++; } } OMAP[nullptr] = -1; NMAP[-1] = nullptr; //第二次遍歷: oldtemp = head; newtemp = newhead; while(oldtemp!=NULL){ newtemp->random = NMAP[OMAP[oldtemp->random]]; oldtemp = oldtemp->next; newtemp = newtemp->next; } return newhead; } };
時間複雜度On,遍歷兩次連結串列
空間複雜度也是On,用還有節點個數的雜湊表來作為輔助變數。