C语言常见单链表面试题(2)
生活随笔
收集整理的這篇文章主要介紹了
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、合并操作是非常適合用遞歸來完成的一類操作,遞歸實現將會比迭代實現更加清晰且易于理解。盡管如此,你可能也不愿意使用遞歸來實現這個操作,因為遞歸方法所使用的??臻g與鏈表的長度成正比。
思路:可以將兩個有序單鏈表的合并簡化為在兩條單鏈表中一直尋找較小的頭節點。但是首先還是要考慮特殊情況
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)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 经典面试总结2
- 下一篇: Cisco路由器基础安全配置---特权模