日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言常见单链表面试题(2)

發布時間:2025/3/19 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言常见单链表面试题(2) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

問題定義:

? ? ? 寫一個函數Merge函數,該函數有兩個參數,都是遞增的鏈表,函數的功能就是合并這兩個遞增的鏈表為一個遞增的鏈表,Merge的返回值是新的鏈表。新鏈表由前兩個鏈表按元素遞增順序合并而成,也就是說它不會創建新的元素。

比如:這里有兩個鏈表,分別是

list1: 5->10->15

list2: 2->3->20

Merge函數返回一個指向新鏈表的指針,新鏈表應該是如下這樣的:2->3->5->10->15->20

? ? ?程序需要考慮如下情況:兩個鏈表(函數參數)都有可能為空,可能連個鏈表其中一個為空,可能兩個鏈表相等,也可能其中一個鏈表已經遍歷完了,另一個鏈表還有很多元素,所以需要首先處理特殊情況。

1、非遞歸實現

pLinkNode?Merge(pList?l1,?pList?l2) {pList?pNewHead?=?NULL;pLinkNode?cur?=?NULL;assert(l1);assert(l2);if?(l1?==?l2)//鏈表相等{return?l1;}if?((l1?==?NULL)?&&?(l2?!=?NULL))//L1為空{return?l2;}if?((l1?!=?NULL)?&&?(l2?==?NULL))//l2為空{return?l1;}if?(l1->data?<?l2->data){pNewHead?=?l1;l1?=?l1->next;pNewHead->next?=?NULL;}else{pNewHead?=?l2;l2?=?l2->next;pNewHead->next?=?NULL;}cur?=?pNewHead;//確定頭指針while?((l1)?&&?(l2)){if?(l1->data?<?l2->data){cur->next?=?l1;l1?=?l1->next;}else{cur->next?=?l2;l2?=?l2->next;}cur?=?cur->next;}if(l1==NULL){cur->next?=?l2;}else{cur->next=?l1;}return?pNewHead; }

2、合并操作是非常適合用遞歸來完成的一類操作,遞歸實現將會比迭代實現更加清晰且易于理解。盡管如此,你可能也不愿意使用遞歸來實現這個操作,因為遞歸方法所使用的棧空間與鏈表的長度成正比。

思路:可以將兩個有序單鏈表的合并簡化為在兩條單鏈表中一直尋找較小的頭節點。但是首先還是要考慮特殊情況

pLinkNode?_Merge(pList?l1,?pList?l2) {pList?pNewHead?=?NULL;pLinkNode?cur?=?NULL;assert(l1);assert(l2);if?(l1?==?l2)//鏈表相等{return?l1;}if?((l1?==?NULL)?&&?(l2?!=?NULL))//L1為空{return?l2;}if?((l1?!=?NULL)?&&?(l2?==?NULL))//l2為空{return?l1;}if?(l1->data?<?l2->data){pNewHead?=?l1;pNewHead->next?=?_Merge(l1->next,?l2);}else{pNewHead?=?l2;pNewHead->next?=?_Merge(l1,?l2->next);}return?pNewHead; }



轉載于:https://blog.51cto.com/10788311/1746893

總結

以上是生活随笔為你收集整理的C语言常见单链表面试题(2)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。