阿里巴巴測試開發校招二面的乙個面試題
乙個單鏈表除了next指標外,還帶有乙個隨機指標(設為rand)指向任意元素,用最少的時間複雜度和最少的空間複製該鍊錶。
開始想了很久,只想到乙個o(n^2)的方法,顯然沒能令面試官滿意,面試官也沒有告訴我正確的方法,只是對我的思路表示肯定。下面先介紹乙個我的面試的時候想到的方法。
方法1:
將這個鍊錶看成是乙個圖,乙個有向的圖,用乙個二維的陣列來記錄這個圖的每個節點的指向。然後根據這個陣列來建立相應的圖。由於需要知道每個節點的隨機節點的指向,故需要遍歷整個鍊錶。所以n個節點,所以時間複雜度就是o(n^2)了。
回到宿舍後,和幾個朋友一番討論,想到乙個o(n)的方法。
方法2:
可以用o(n)的時間複雜度和o(1)的附加空間實現:根據源鍊錶依次複製出新鍊錶的對應節點,並將新節點插入到源節點後,新鍊錶的rand指標指向原鍊錶的rand;然後遍歷一遍鍊錶,將新鍊錶的rand指標指向對應元素的next元素(即新鍊錶中對應的rand指標元素);最後將新煉表和源鍊錶分離。
struct node_t ;
struct node_t * copylist(struct node_t **dest, struct node_t *src)
/* 處理新的節點,新節點的隨機指標指向原節點下隨機指標的下乙個節點 */
p = src;
while (p != null)
p = src;
*dest = p->next;
/* 將原節點和新節點分離,恢復原節點 */
while (p != null)
return *dest;
}
方法2是改變next指標,也可以考慮改變隨機指標,思路是一樣的。
複製帶隨機指標的鍊錶
給出乙個鍊錶,每個節點包含乙個額外增加的隨機指標可以指向鍊錶中的任何節點或空的節點。返回乙個深拷貝的鍊錶。public randomlistnode copyrandomlist randomlistnode head hashmapmap new hashmap randomlistnode du...
複製帶隨機鍊錶的指標
題目要求 給定乙個鍊錶,每個節點包含乙個額外增加的隨機指標,該指標可以指向鍊錶中的任何節點或空節點。要求返回這個鍊錶的深拷貝。這道題我知道的有兩種解法 一種是遍歷鍊錶,找到每乙個節點的隨機指標,但是這樣做時間複雜度是o n 2 另外一種是拷貝節點的方法,下面我用一幅圖具體講一下節點的拷貝思路。下面配...
複製帶隨機指標的鍊錶
解題思路是先建立一條複製鍊錶,複製鍊錶的val和原始鍊錶的val相對應,建立過程中,使用雜湊表建立原始結點和複製結點的對映。原始結點為key,複製結點為value。那麼,在複製鍊錶中查詢當前結點的隨機指標時,當前對應原始結點的隨機指標所對映的值value就是這個複製結點的隨機指標。這個解題思路關鍵在...