合併兩個己排好序的鍊錶及陣列

2022-09-06 15:48:11 字數 3147 閱讀 7613

唉,這麼簡單的東西,說簡單是簡單,關鍵是要把這東西寫得好,老少兼知。應對所有測試用例,那就有點難了吧。話說天下之事,作於細。

我們用圖來說說吧:

看合併的步驟:(1)

(2)(3)

(4)源**:

#ifndef

combine_two_list_h

#definecombine_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

#definecombine_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

注邊界條件:

if

(arr1iter

>

arr1

+len1-1

)}if(arr2iter

>

arr2

+len2-1

)

}

來自為知筆記(wiz)

合併兩個排好序的鍊錶

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 的乙個非常典型的應用,且各層分治遞迴可以同時進行。也叫歸併演算法,指的是將兩個已經排序的序列合併成乙個序列的操作。歸併排序演算法依...