鏈表(2)

案例1
給定一個整數num,如何在節點值有序的環形鏈表中插入一個節點值爲num的節點,且保證這個環形單鏈表依然有序。
解法:時間複雜度O(N),額外空間複雜度O(1)。
這裏寫圖片描述

這裏寫圖片描述
插入node,返回head即可。
這裏寫圖片描述

3.若p和c轉一圈都沒發現應插入的位置(該節點比整個鏈表都大或都小),此時node應插入頭結點的前面。
若節點值最小,頭結點應返回該節點;若節點值最大,頭結點應返回原頭節點。

案例2
給定一個鏈表中的節點node,但不給定整個鏈表的頭結點。如何在鏈表中刪除node?請實現這個函數,要求時間複雜度O(1)
分析:雙鏈表很容易
單鏈表思路:
這裏寫圖片描述
2的值變爲3的值,然後刪掉節點3該思路問題:
1.無法刪除最後一個節點
如圖,節點3沒法刪除
這裏寫圖片描述
這裏寫圖片描述

案例3
給定一個鏈表的頭節點head,再給定一個數num,請把鏈表調整成節點值小於num的節點都放在鏈表左邊,值等於num的節點都放在鏈表中間,值大於num的節點都放在鏈表右邊。

簡單做法:
1.將鏈表所有節點放入到數組中,然後將數組進行快速劃分的調整過程。
2、將數組中的節點依次重新串聯。

最優解爲,將大鏈表拆成3個小鏈表(大於,小於,等於),最後再把鏈表重新組合在一起。該法沒有額外空間複雜度,但易出錯。

案例4
給定兩個有序鏈表頭結點head1和head2,打印兩個有序鏈表的公共部分。
分析:
1.若兩個鏈表有任何一個爲空,直接返回即可。
2.不爲空,就遍歷。
這裏寫圖片描述
若c1小,c1向下一個,再比較。
若c2小,c2向下一個,再比較。相同值,打印出來。c1和c2都向下移動。
兩個表有一個到空,過程截止。

案例5
給定一個單鏈表的頭結點head,實現一個調整單鏈表的函數,使每K個結點之間逆序,若最後不夠K個節點一組,則不調整最後幾個節點。
例:1 2 3 4 5 6 7 8 k=3
調整爲3 2 1 6 5 4 7 8
分析:1.鏈表爲空,爲1或2,鏈表不用進行調整。
鏈表長度爲n
方法1:時間複雜度爲O(n),額外空間複雜度爲O(k)
利用棧處理
棧的彈入彈出就是逆序的過程,每k個數入棧。
難點:最後一組不足k的處理,next指針的切換。
第一組需要特殊處理。

方法2:時間複雜度爲O(n),額外空間複雜度爲O(1)
法2與法1類似,但省去棧的結構,需要更多的邊界討論及代碼實現技巧。

案例6
給定一個單鏈表的頭節點head,再給定一個數val,把等於val的節點刪掉。
分析:即重新建立鏈表的過程,需要val的值,就刪掉跳至下一節點。
需要考慮好種種邊界條件問題。

案例7
判斷一個鏈表是否爲迴文結構
例:12321 true
1231 false

方法1,時間複雜度爲O(n),額外空間複雜度爲O(n)
申請個棧,把鏈表的數都壓入棧中。
再次遍歷鏈表,並每個都彈出一個棧的值,進行比較。都相等,true。

方法2,時間複雜度爲O(n),額外空間複雜度爲O(n/2)
利用棧,前一半壓入,後一半彈出並進行比較。
奇數節點數,不考慮中間點。

方法3,時間複雜度爲O(n),額外空間複雜度爲O(1)
1.找到中間節點
這裏寫圖片描述

2.右半部分逆序
這裏寫圖片描述
3.從鏈表兩頭依次對比。
這裏寫圖片描述
PS:返回之前,需要把鏈表的結構調整回來。

案例8
這裏寫圖片描述

分析:1.鏈表爲空,直接返回空
2.若不爲空,原鏈表節點間插入指針。
這裏寫圖片描述
再次遍歷鏈表,同時拿到1和1’
這裏寫圖片描述

這裏寫圖片描述
同理
這裏寫圖片描述
再把大鏈表分流成兩個鏈表即可
這裏寫圖片描述

案例9
如何判斷一個單鏈表是否有環?
有環的話返回進入環的第一個節點,無環的話返回空。若鏈表的長度爲N,請做到時間複雜度爲O(N),額外空間複雜度爲O(1)

無限制的話,普通法用哈希表來實現。

最優解:
快慢指針
這裏寫圖片描述
快指針一次走兩步, 慢指針一次走一步
若有環,快慢指針將在環中某一個位置相遇。
這裏寫圖片描述
此時,快指針回到頭部,一次一步走,慢指針從相遇點,一次一步走。再次相遇的點,爲第一個入環節點。
這裏寫圖片描述

案例10
如何判斷兩個無環單鏈表是否相交?相交的話返回第一個相交的節點,不相交的話返回空。若兩個鏈表的長度分別爲N和M,請做到時間複雜度爲O(N+M),額外空間複雜度爲O(1)

無限制的話,普通法用哈希表來實現。

最優解:
1.遍歷兩個鏈表,統計各自長度。
這裏寫圖片描述
讓長度爲100的鏈表先走50步,接下來再一起走,若相交,在同步走的過程中一定能走到第一個相交的節點,若走到最後都沒有相交,說明不相交。

案例11
如何判斷兩個有環單鏈表是否相交?相交的話返回第一個相交的節點,不相交的話返回空。若兩個鏈表的長度分別爲N和M,請做到時間複雜度爲O(N+M),額外空間複雜度爲O(1)

解:根據之前找環形鏈表第一個入環點的題目,找兩個鏈表各自的入環節點。
這裏寫圖片描述
若node1=node2,則入環前肯定相交,需要找第一個相交節點,做法同案例11相同,不同的是,遍歷到共用入環節點即可。
這裏寫圖片描述

若入環節點不同,只能是以下兩種情況。
這裏寫圖片描述
區分方法,鏈表1環的過程中,需要第2個鏈表的入環節點,就是情況2,沒遇到就是情況1。

情況1返回空
情況2返回node1或node2都正確。

案例12
給定兩個單鏈表頭節點head1和head2,如何判斷兩個,鏈表是否相交?相交的話返回第一個相交的節點,不相交的話返回空。
這裏寫圖片描述

發佈了48 篇原創文章 · 獲贊 2 · 訪問量 9802
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章