題目:輸入兩個遞增排序的鍊錶,合併這兩個鍊錶並使新鍊錶中的結點仍然是按照遞增排序的。例如下圖中的鍊錶1和鍊錶2,則合併之後的公升序鍊錶如鍊錶3所示。
鍊錶結點定義如下:
注:鍊錶1和鍊錶2是兩個遞增排序的鍊錶,合併這兩個鍊錶得到公升序鍊錶為鍊錶3.
首先分析合併兩個鍊錶的過程。我們的分析從合併兩個鍊錶的頭結點開始。鍊錶1的頭結點的值小於鍊錶2的頭結點的值,因此鍊錶1的頭結點將是合併後鍊錶的頭結點。如下圖所示。
繼續合併兩個鍊錶中剩餘的結點(圖中虛線框所示)。在兩個鍊錶中剩下的結點依然是排序的,因此合併這兩個鍊錶的步驟和前面的步驟是一樣的。我們還是比較兩個頭結點的值。此時鍊錶2的頭結點的值小於鍊錶1的頭結點的值,因此鍊錶2的頭結點的值將是合併剩餘結點得到的鍊錶的頭結點。我們把這個結點和前面合併鍊錶時得到的鍊錶的尾結點(值為1的結點)鏈結起來,如圖所示。
當我們得到兩個鍊錶中值較小的頭結點並把它連線到已經合併的鍊錶之後,兩個鍊錶剩餘的結點依然是排序的,因此合併的步驟和之前的步驟是一樣的。這就是典型的遞迴的過程,可以定義遞迴函式來完成者以合併過程。
每當**試圖訪問空指標指向的記憶體時程式就會崩潰,從而導致魯棒性問題。在本題中,當第乙個鍊錶是空鍊錶,也就是它的頭結點是乙個空指標時,那麼把它和第二個鍊錶合併,顯然合併的結果是第二個鍊錶。同樣,當輸入的第二個鍊錶的頭結點是空指標時,我們把它和第乙個鍊錶合併得到的結果就是第乙個鍊錶。如果兩個鍊錶都是空鍊錶,合併的結果是得到乙個空鍊錶。
實現**如下:
listnode* merge(listnode* phead1, listnode* phead2)
else
return pmergedhead;
}
合併兩個排序鍊錶
struct listnode class solution else while pstart1 null pstart2 null plast next pstart1 plast pend1 pend1 pend1 next pstart1 pend1 else plast next psta...
合併兩個排序鍊錶
描述 將兩個排序鍊錶合併為乙個新的排序鍊錶樣例 給出1 3 8 11 15 null,2 null,返回1 2 3 8 11 15 null。解題思路 將兩個鍊錶當中的對應元素的值進行比較,重新確定新鍊錶當中元素的位置。若第乙個鍊錶當前位置的值小於第二個鍊錶當前值,則不需要改變位置,第乙個鍊錶的指標...
合併兩個排序鍊錶
問題描述 將兩個排序鍊錶合併為乙個新的排序鍊錶 樣例 給出1 3 8 11 15 null,2 null,返回1 2 3 8 11 15 null。解題思路 遍歷第二個鍊錶的每乙個節點,然後與第乙個節點的第乙個節點比較,如果第二個鍊錶節點的值小於第乙個,就插入到第乙個煉表裡,如果大於就到下乙個節點。...