PTA 鍊錶拼接(三種方法 鍊錶 遞迴 排序移動)

2021-10-23 09:49:30 字數 2104 閱讀 1539

本題要求實現乙個合併兩個有序鍊錶的簡單函式。鍊錶結點定義如下:

struct listnode 

;

struct listnode *

mergelists

(struct listnode *list1,

struct listnode *list2)

;

其中list1list2是使用者傳入的兩個按data公升序鏈結的鍊錶的頭指標;函式mergelists將兩個鍊錶合併成乙個按data公升序鏈結的鍊錶,並返回結果鍊錶的頭指標。

#include

#include

struct listnode

;struct listnode *

createlist()

;/*裁判實現,細節不表*/

struct listnode *

mergelists

(struct listnode *list1,

struct listnode *list2)

;void

printlist

(struct listnode *head )

printf

("\n");

}int

main()

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

1 3 5 7 -1

2 4 6 -1

1 2 3 4 5 6 7

函式體**:

方法一(鍊錶):

struct listnode*

mergelists

(struct listnode* list1,

struct listnode* list2)

// 鍊錶一為空,返回鍊錶二

elseif(

(s1 ==

null)&&

(s2 !=

null))

// 兩鍊錶都不為空

else

if(s1 !=

null

&& s2 !=

null

)// s2的第乙個資料小,p指向s2,s2後移

else

while(1

)}// s2當前資料小,p指向s2,s2後移

else}}

}// 返回拼接後的鍊錶

return head;

}

方法二(遞迴):

struct listnode*

mergelists

(struct listnode* list1,

struct listnode* list2)

// l2的第乙個資料小,l2後移,遞迴拼接

else

}}

方法三(排序移動):

struct listnode*

mergelists

(struct listnode* list1,

struct listnode* list2)

// 鍊錶一為空,返回鍊錶二

if(list2 ==

null

)struct listnode* p,

*q;int num;

for(p = list1; p->next !=

null

; p = p->next)

; p->next = list2;

for(p = list1; p !=

null

; p = p->next)}}

return list1;

}

以上用了三種方法進行鍊錶拼接,個人覺得遞迴方式最簡單,理解起來也不難;鍊錶的方法也比較好理解;最後排序的方法可能不太好理解,可以根據自己情況參考理解**。

鍊錶建立的三種方法

作為最常用的資料結構之一,鍊錶被廣泛應用在各個方面,下至作業系統底層的驅動程式上至各種應用軟體,都處處可以看到鍊錶的身影,皆因其操作的簡便與應用的高效性。總結個人目前所學,鍊錶的建立方式主要有 以下幾種方法 方法一 struct link node struct link node list nul...

鍊錶逆置 三種方法詳解

achievek 本題要求實現乙個函式,將給定的單鏈表逆轉。函式介面定義 list reverse list l 其中list結構定義如下 typedef struct node ptrtonode struct node typedef ptrtonode list 定義單鏈表型別 l是給定單鏈表...

leecode206 鍊錶反轉 三種方法

第一種 記錄前驅,從第乙個節點開始 1.用乙個指標記錄其next的位置 防止在其指向前面節點無法指向後面的節點的位置 q p next 2.記錄了後面的位置,那我們可以大膽的將p next指向前驅節點pre p next pre 3.前驅節點變為當前節點 pre p 4.當前節點可以達到後面節點的位...