加油站;及拷貝連結串列分析

紫鳳發表於2013-10-21

今日面試題:加油站

城市的環形路有n個加油站,第i個加油站的油量用gas[i]來表示,你有如下的一輛車:

1. 它的油缸是無限量的,初始是空的

2. 它從第i個加油站到第i+1個加油站消耗油量為cost[i]

現在你可以從任意加油站開始,路過加油站可以不斷的加油,問是否能夠走完環形路。如果可以返回開始加油站的編號,如果不可以返回-1。注意,解決方案保證是唯一的。

================================================

拷貝連結串列分析

原題

有一個連結串列,每一個節點除了next指標指向一下節點以外,又多出了一個指標random,指向連結串列中的任何一個節點,包括null。請給出方法完成連結串列的深拷貝。

分析

這個問題的關鍵就在於random指標如何完成拷貝,next指標一次遍歷就完成了,random指標拷貝的關鍵在於,如何找到random指向的 節點對應的新的節點。一般來講,大家會想到用map來儲存舊的節點到新的節點的對映,這樣得到的方法的時間複雜度為O(n),空間複雜度為O(n)。下面 是一個可行的方法:oldlist為原始連結串列,copylist為新的連結串列,oldnode為oldlist中的節點,copynode為 copylist中的節點:

1. 根據oldlist,建立copylist,只拷貝next指標

2. 儲存oldnode到oldnode.next的對映

3. 將oldlist中的oldnode的next指標指向copylist中對應的copynode

4. 將copylist中的copynode的random指標指向oldlist中對應的oldnode

5. 對於copylist中的每一個節點:copynode.random=copynode.random.random.next

6. 根據第2步,建立的對映,恢復oldlist

上面這個方法,需要額外的對映。下面介紹一個巧妙的方法,可以省去對映的部分

1. 對oldlist中的節點,依次作如下的操作:對於第i個節點oldnode[i],生成拷貝節點copynode[i],並且插入在oldnode[i]和oldnode[i+1]之間,最後一個節點直接附加到oldlist後面即可。

2. 處理每一個copynode的random拷貝,及對每一個copynode=oldnode.next, oldnode.next.random=oldnode.random.next 後面的next確保是copynode。

3. 通過如下的操作,恢復oldlist,以及生成copylist 1) oldnode.next = oldnode.next.next 2) copynode.next = copynode.next.next 這裡要注意,oldnode的最後一個節點,next是null

注意題目中的random可能指向null,在上面第2步的時候處理一下就可以了。

【分析完畢】

本文來自微信:待字閨中,2013-10-08釋出,原創@陳利人 ,歡迎大家繼續關注微信公眾賬號“待字閨中”。

相關文章