唉,這麼簡單的東西,說簡單是簡單,關鍵是要把這東西寫得好,老少兼知。應對所有測試用例,那就有點難了吧。話說天下之事,作於細。
我們用圖來說說吧:
看合併的步驟:(1)
(2)(3)
(4)源**:
邊界條件注意:#ifndef
combine_two_list_h
#define
combine_two_list_h
#include
"reverselist.h"
listnode
*combinetwolist
(listnode
*alist
,listnode
*blist
)
if(
alist
!=null
&&blist
==null
)
if(
alist
==null
&&blist
==null
)
listnode
*prelist
=alist
;
listnode
*bcklist
=blist
;
listnode
*rootindex
=null
;
if(
prelist
->
val>=
bcklist
->
val)
else
listnode
*result
=rootindex
;
while
(prelist
!=null
&&bcklist
!=null
)else
}
if(
prelist
==null
)
if(
bcklist
==null
)
return
result
;
}
#endif
測試:if
(prelist
==null
)
if
(bcklist==null
)
其實這種思維式和合併兩個己排好的陣列是差不多的,大家可能知道歸併排序吧,裡面不是有個合併兩個己排好序的int
main
();
intarr2[6
]=;
listnode
*root1
=constructlist
(arr1,4
);
listnode
*root2
=constructlist
(arr2,6
);
listnode
*root
=combinetwolist
(root1
,root2
);
printlist
(root
);
}
陣列的操作 嗎?
嗯,我們來看看,其實也是一樣。
原始碼:
注邊界條件:#ifndef
combine_two_arr_h
#define
combine_two_arr_h
int
*combinearr
(int
*arr1
,int
len1
,int
*arr2
,int
len2
)else
}
if(
arr1iter
>
arr1
+len1-1
)
}
if(
arr2iter
>
arr2
+len2-1
)
}
return
arr;
}
#endif
來自為知筆記(wiz)if
(arr1iter
>
arr1
+len1-1
)
}
if(
arr2iter>
arr2
+len2-1
)
}
合併兩個排好序的鍊錶
typedef struct nodetag node typedef node pnode node combine node p1,node p2 while p1 null p2 null p1 valval p next p2 return head node build int a,int...
鏈結排好序的兩個鍊錶(類似於mergeSort)
題目 給定兩個已知排好序的鍊錶,將兩鍊錶鏈結,構成的新鍊錶需要排好序 思路 從鍊錶開頭比較結點大小,若第一條煉表頭節點值不大於第二條,將第一鍊錶指標指向下乙個,若第一條鍊錶值大,將第二條鍊錶指標指向下乙個。最後將剩下未到末結點的鍊錶鏈結到新鍊錶!如下 definition for singly li...
排序 四 歸併排序(合併兩個已經排好序的陣列)
是建立在歸併操作上的一種有效的排序演算法。平均 最好和最壞時間複雜度都為o nlog2n 線性對數。是穩定的。該演算法是採用分治法 divide and conquer 的乙個非常典型的應用,且各層分治遞迴可以同時進行。也叫歸併演算法,指的是將兩個已經排序的序列合併成乙個序列的操作。歸併排序演算法依...