本題要求實現乙個合併兩個有序鍊錶的簡單函式。鍊錶結點定義如下:
struct listnode
;
struct listnode *
mergelists
(struct listnode *list1,
struct listnode *list2)
;
其中list1
和list2
是使用者傳入的兩個按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 -12 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.當前節點可以達到後面節點的位...