問題詳細描述:
將遞增有序A、B兩鏈表歸併成一個按元素值非遞增(允許有相同值)有序的鏈表C。
解題思路:
利用A、B兩表遞增有序的特點,依次取出當前結點進行比較,將當前值較小者摘下,插入到C表的頭部,由於採用的是頭插法,最先找到的最小值結點將會在C表的尾部,依次類推,所以得到的C表則爲非遞增有序的。這裏的遞增遞減性質需要根據代碼具體修改實現。已在代碼中給出提示。
/**
* @TODO 兩個數據元素類型爲“整型”的遞增(或者遞減)單鏈表合併,由a單鏈表調用
* @param bFoll 單鏈表b
* @return c 單鏈表c
* (合併結果爲非遞減(或者非遞增),取決於a,b鏈表的遞增遞減性質和合並函數的插入方法的選取)
*/
public FOLinkedList<Integer> merge(FOLinkedList<Integer> bFoll){
FOLinkedList<Integer> c = new FOLinkedList<Integer>();
FOLinkedNode<Integer> a = (FOLinkedNode<Integer>) this.header;
FOLinkedNode<Integer> b = bFoll.header;
Integer eTemp = new Integer(0);
while(a != null && b != null){
if(a.getE()<=b.getE()){
eTemp = a.getE();
a = a.next;
}else{
eTemp = b.getE();
b = b.next;
}
//這裏可以採用頭插法,或者尾插法
c.add(eTemp);
// c.addFirst(eTemp);
}
if(a == null){
a = b;
}
while(a != null){
c.add(a.getE());
a = a.next;
}
return c;
}
將遞增有序的A,B鏈表合併成非遞減的鏈表C,採用尾插法即可實現。
具體操作需要根據代碼來進行修改,上述代碼中可以修改插入元素的方法爲頭插法或者尾插法。
該算法的時間性能由兩待合併鏈表的的元素個數來決定,即爲O(m+n)