C語言常見單鏈表面試題(2)

2021-07-12 04:30:39 字數 1139 閱讀 9994

問題定義:

寫乙個函式merge函式,該函式有兩個引數,都是遞增的鍊錶,函式的功能就是合併這兩個遞增的鍊錶為乙個遞增的鍊錶,merge的返回值是新的鍊錶。新煉表由前兩個鍊錶按元素遞增順序合併而成,也就是說它不會建立新的元素。

比如:這裡有兩個鍊錶,分別是

list1: 5->10->15

list2: 2->3->20

merge函式返回乙個指向新鍊錶的指標,新鍊錶應該是如下這樣的:2->3->5->10->15->20

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

1、非遞迴實現

plinknode merge(plist l1, plist l2)

if ((l1 == null) && (l2 != null))//l1為空

if ((l1 != null) && (l2 == null))//l2為空

if (l1->data < l2->data)

else

cur = pnewhead;//確定頭指標

while ((l1) && (l2))

else

cur = cur->next;

} if(l1==null)

else

return pnewhead;

}

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

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

plinknode _merge(plist l1, plist l2)

if ((l1 == null) && (l2 != null))//l1為空

if ((l1 != null) && (l2 == null))//l2為空

if (l1->data < l2->data)

else

return pnewhead;

}

常見單鏈表面試題

面試中經常被問到有關鍊錶的問題,現總結如下 此處的鍊錶結構為不帶頭結點的單鏈表 單鏈表結構 struct listnode 1 尾插法建立單鏈表 listnode buildlisttail int n else return head 輸入1 2 3 4,輸出1 2 3 42 頭插法建立單鏈表 l...

單鏈表 (面試題)

關於單鏈表的基本操作,之前已經總結過了,那些掌握之後算是了解了單鏈表是什麼?不過現在面試的題中,肯定不會只讓你回答單鏈表的基礎操作,總是會改變一些東西,或是擴充套件一下。下面就是一些關於單鏈表的擴充套件內容 include include include pragma warning disable...

單鏈表面試題

1.倒序列印鍊錶 void reverseprint slistnode pfirst 有兩種方法 1.遞迴操作 2.非遞迴操作 2 非遞迴 slistnode pend slistnode pcur pend null while pfirst pend pend pcur printf d pe...