1. 程式人生 > 實用技巧 >劍指 Offer 35. 複雜連結串列的複製 - 8月17日

劍指 Offer 35. 複雜連結串列的複製 - 8月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,用還有節點個數的雜湊表來作為輔助變數。

拓展學習