複雜鍊錶的複製 劍指offer 面試題35

2021-09-11 01:32:16 字數 1001 閱讀 3335

輸入乙個複雜鍊錶(每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點),返回結果為複製後複雜鍊錶的head。(注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空)

本題是對複雜鍊錶的複製,這裡實現的方法時間複雜度是o(n),並且沒有開闢額外的空間;

1)首先複製原來的複雜(隨機)鍊錶,形成a->a`->b->b`->...->z->z`連線形式,其中a`、b`...z`是new出來的複雜鍊錶元素,但是沒有複雜鍊錶的random指標,該指標賦值為nullptr;該步的時間複雜度為o(n);

2)其次遍歷複製後的鍊錶,將a的random指標賦值給a`的random指標,該步驟的時間複雜度為o(n);

3)  最後將賦值後的鍊錶拆開為 a->b->...->z 和a`->b`->...->z`,從而完成複雜(隨機)鍊錶的複製,該步驟的時間複雜度也為o(n)。

綜上該種方法除了new必要的複製鍊錶元素之外,沒有開闢額外的空間,總的時間複雜度為o(n)。

此外還有無腦複製的方法,時間複雜度為o(n^2);開闢額外空間hash的方法,時間複雜度也為o(n),但是開闢了乙個大小為o(n)的雜湊表。

/*struct randomlistnode

};*/

class solution

//第一步複製複雜鍊錶建立a->a`->b->b`...->z->z`

void clonelistnodes(randomlistnode* phead)

}//第二步複製原始鍊錶的任意指標

void copyrandomnodes(randomlistnode* phead)

curnode = curnode->next->next;}}

//第三步拆分鍊錶為兩個鍊錶

randomlistnode* splitlists(randomlistnode* phead)

while(curnode != nullptr)

return clonerandomlistnodes;}};

劍指offer複雜鍊錶複製

題目描述 輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空 我的 思路比較笨,就是首先構造乙個正常的不大random指標的鍊錶,然後再去遍歷...

劍指offer 複雜鍊錶複製

輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空 解題思路 1 複製每個節點,如 複製節點a得到a1,將a1插入節點a後面 2 遍歷鍊錶,a...

劍指offer 複雜鍊錶複製

題目描述 輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空 非遞迴方法 struct randomlistnode randomlistno...