首先分析合併兩個鍊錶的過程。我們的分析從合併兩個鍊錶的頭結點開始。鍊錶1的頭結點的值小於鍊錶2的頭結點的值,因此鍊錶1的頭結點將是合併後鍊錶的頭結點。如下圖所示。
繼續合併兩個鍊錶中剩餘的結點(圖中虛線框所示)。在兩個鍊錶中剩下的結點依然是排序的,因此合併這兩個鍊錶的步驟和前面的步驟是一樣的。我們還是比較兩個頭結點的值。此時鍊錶2的頭結點的值小於鍊錶1的頭結點的值,因此鍊錶2的頭結點的值將是合併剩餘結點得到的鍊錶的頭結點。我們把這個結點和前面合併鍊錶時得到的鍊錶的尾結點(值為1的結點)鏈結起來,如圖所示。
當我們得到兩個鍊錶中值較小的頭結點並把它連線到已經合併的鍊錶之後,兩個鍊錶剩餘的結點依然是排序的,因此合併的步驟和之前的步驟是一樣的。這就是典型的遞迴的過程,可以定義遞迴函式來完成者以合併過程。
每當**試圖訪問空指標指向的記憶體時程式就會崩潰,從而導致魯棒性問題。在本題中,當第乙個鍊錶是空鍊錶,也就是它的頭結點是乙個空指標時,那麼把它和第二個鍊錶合併,顯然合併的結果是第二個鍊錶。同樣,當輸入的第二個鍊錶的頭結點是空指標時,我們把它和第乙個鍊錶合併得到的結果就是第乙個鍊錶。如果兩個鍊錶都是空鍊錶,合併的結果是得到乙個空鍊錶。
1.遞迴
#include #include using namespace std;
//無頭節點
struct listnode
;void insertlistnode( listnode **head, int value)
else
}listnode* merge(listnode *p1 ,listnode *p2)
else
return head;
}void printlistnode(listnode * node)
cout<
2.迴圈
#include #include using namespace std;
//無頭節點
struct listnode
;void insertlistnode( listnode **head, int value)
else
}listnode* merge(listnode *p1 ,listnode *p2)
else
if (head == null)
else
}while( p1 !=null)
while( p2 !=null)
return head;
}void printlistnode(listnode * node)
cout<
劍指Offer17合併兩個排序的鍊錶
題目 輸入兩個遞增排序的鍊錶,合併這個兩個鍊錶並使得新煉表中的結點仍然是按照遞增排序的。這個題目很簡單,下面直接看 我用兩種方式實現了題目的要求,遞迴的方法是書上寫的,很短小,也很經典。非遞迴方法有大的冗餘。遞迴 listnode merge listnode list1,listnode list...
劍指offer 17 合併兩個排序的鍊錶
題目 合併兩個增序鍊錶 解法1 非遞迴的方法 public class main public static listnode mergelist listnode node1,listnode node2 if node2 null listnode result listnode temp 返回...
劍指offer 17 合併兩個排序的鍊錶
題目描述 輸入兩個單調遞增的鍊錶,輸出兩個鍊錶合成後的鍊錶,當然我們需要合成後的鍊錶滿足單調不減規則。遞迴 struct listnode class solution else return pmergehead 非遞迴 struct listnode class solution else li...