演算法 線性結構1 兩個有序鍊錶序列的合併

2021-10-04 05:16:48 字數 1687 閱讀 6295

浙江大學 資料結構 思考題+每週練習答案彙總

題目:本題要求實現乙個函式,將兩個鍊錶表示的遞增整數序列合併為乙個非遞減的整數序列。

list merge( list l1, list l2 );
其中list結構定義如下:

typedef struct node *ptrtonode;

struct node ;

typedef ptrtonode list; /* 定義單鏈表型別 */

l1l2是給定的帶頭結點的單鏈表,其結點儲存的資料是遞增有序的;函式merge要將l1l2合併為乙個非遞減的整數序列。應直接使用原序列中的結點,返回歸併後的帶頭結點的煉表頭指標。

#include #include typedef int elementtype;

typedef struct node *ptrtonode;

struct node ;

typedef ptrtonode list;

list read(); /* 細節在此不表 */

void print( list l ); /* 細節在此不表;空煉表將輸出null */

list merge( list l1, list l2 );

int main()

/* 你的**將被嵌在這裡 */

3

1 3 5

52 4 6 8 10

1 2 3 4 5 6 8 10 

null

null

解答:

一下子就能想到的思路是把另乙個煉表裡的每個數都插入到第乙個煉表裡,最後把第乙個煉表頭再轉移(因為要列印出來null)。

大致演算法框架如下:

list merge( list l1, list l2 )

//第二種情況:mylist的data等於,其實該情況可以與上面的情況進行合併

//第三種情況:mylist的data大於mylistl1的data

mylist = mylist->next;

}}

這樣演算法複雜度只有o(n),但是程式設計起來有點困難:因為加入增刪改查也並不是很方便,也需要記錄很多資訊,費了半天勁越寫越亂,於是這裡就不採用了。

然後想到第二種思路:建立乙個新錶,然後把兩個表迴圈遍歷,不斷往上面新增。

下面是可提交版本:

list merge( list l1, list l2 )else

l=l->next;

} if(l1forcircle)

if(l2forcircle)

//這裡千萬不能迴圈刪除,因為我們這裡並不是在複製,而是直接把指標進行了引用

//所以都是指向了原資料。故現在只需要讓兩個鍊錶的頭結點都指向 null 就行了。

l1->next = null;

l2->next = null;

return myhead;

}

演算法複雜度也不是很高,也是o(n),而且關鍵是程式設計特別簡單。

02 線性結構1 兩個有序鍊錶序列的合併

本題要求實現乙個函式,將兩個鍊錶表示的遞增整數序列合併為乙個非遞減的整數序列。函式介面定義 list merge list l1,list l2 其中list結構定義如下 typedef struct node ptrtonode struct node typedef ptrtonode list...

02 線性結構1 兩個有序鍊錶序列的合併

本題要求實現乙個函式,將兩個鍊錶表示的遞增整數序列合併為乙個非遞減的整數序列。函式介面定義 list merge list l1,list l2 其中list結構定義如下 typedef struct node ptrtonode struct node typedef ptrtonode list...

02 線性結構1 兩個有序鍊錶序列的合併

資料結構一的基礎題 pta 本題要求實現乙個函式,將兩個鍊錶表示的遞增整數序列合併為乙個非遞減的整數序列。list merge list l1,list l2 其中list結構定義如下 typedef struct node ptrtonode struct node typedef ptrtono...