List類題型:Sort LinkedList using Insertion Sort

排序是CS的一個基本功,不過大部分訓練都是在Array的排序上。相比起Array排序,List的排序會難上不少。

第一次做的一些思路: 肯定首先是要iterate throug 整個List。 然后根據insertion sort的idea,每一次到一個新的node,就要跟前面的已經sort好的部分做比較,插入到第一個比node小的地方。但是想到這里就會發現一些問題, 比如說由于List Node沒有前指針,所以是不可能從Node往前面sorted section iterate的。所以基本上可以知道每次到一個新的node, 都得從List的頭重新往后iterate,找到一個合適的地方插進去。然后還有一個問題就是當發現了合適的地方要插進去的時候,Node的next索引應該為Node.prev 來指過去。還有!萬一原List的第一個Node其實應該丟到最后一個位置,那整個list的頭都得變, 這邊馬上會想到我們需要一個Fake head points to list head.

一系列的問題在面試的時候突然要迅速解決,我覺得還是難度值還是挺高的。。。

5min later..

我自己的solution也算是work,基本就是上述的寫法,不過run time實在是太慢了。

看了一下Leetcode discussion的解法:

總結了一下。 1: ?Iterate list的時候,大神做了一個判斷。 如果當前node比下一個小的時候,啥也不做,iterate到下一個node。【邏輯上很正常, 因為 1-2-3 比下一個小就不用排序了】 ?如果當前node比下一個大,那就說明這個node需要處理一下了。 怎么處理?

while (first.next.val < curr.next.val) : first = first.next; ?從List 的頭開始,iterate一直到出現一個node such that它的下一個的node的值是小于curNode的下一個node的值。也就是說從sorted section找到第一個能插入的地方。改變一下索引,first.next = cur.next. [重要的一點是,最后first 要point back to fake 這樣下一次才能繼續用]

假設3->1-->4 cur從3 開始, 變成1->3->4 cur現在在3. 我們會注意到每次當他iterate到新的node的時候,cur 指向的是sorted section的最后一個node。在cur之前的全部是sorted好的,這樣他只要把cur.next往之前所有里找一個空插入就好了。相比之前我的做法就顯得異常的麻煩,還要設立一個單獨的node做為sorted section的最后一個node。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容