微軟等100題系列V0.1版整理II:連結串列面試題集錦
--
July 2010年12月14日
=======================
此微軟等100題系列V0.1版,關於連結串列的面試題,佔了11道。
連結串列,在資料結構中,也是一個最基本的重頭戲。
請看:
--------------
第7題
微軟亞院之程式設計判斷倆個連結串列是否相交
給出倆個單向連結串列的頭指標,比如h1,h2,判斷這倆個連結串列是否相交。
為了簡化問題,我們假設倆個連結串列均不帶環。
問題擴充套件:
1.如果連結串列可能有環列?
2.如果需要求出倆個連結串列相交的第一個節點列?
第13題:
題目:輸入一個單向連結串列,輸出該連結串列中倒數第k個結點。
連結串列的倒數第0個結點為連結串列的尾指標。
連結串列結點定義如下:
struct ListNode
{
int m_nKey;
ListNode* m_pNext;
};
第24題:
連結串列操作,
(1).單連結串列就地逆置,
(2)合併連結串列
42.請修改append函式,利用這個函式實現:
兩個非降序連結串列的並集,1->2->3 和 2->3->5 併為 1->2->3->5
另外只能輸出結果,不能修改兩個連結串列的資料。
58.從尾到頭輸出連結串列。
題目:輸入一個連結串列的頭結點,從尾到頭反過來輸出每個結點的值。
連結串列結點定義如下:
struct ListNode
{
int m_nKey;
ListNode* m_pNext;
};
分析:這是一道很有意思的面試題。
該題以及它的變體經常出現在各大公司的面試、筆試題中。
60.在O(1)時間內刪除連結串列結點。
題目:給定連結串列的頭指標和一個結點指標,在O(1)時間刪除該結點。
連結串列結點的定義如下:
struct ListNode
{
int m_nKey;
ListNode* m_pNext;
};
函式的宣告如下:
void DeleteNode(ListNode* pListHead, ListNode* pToBeDeleted);
分析:這是一道廣為流傳的Google面試題,能有效考察我們的程式設計基本功,
還能考察我們的反應速度,更重要的是,還能考察我們對時間複雜度的理解。
62.找出連結串列的第一個公共結點。
題目:兩個單向連結串列,找出它們的第一個公共結點。
連結串列的結點定義為:
struct ListNode
{
int m_nKey;
ListNode* m_pNext;
};
分析:這是一道微軟的面試題。微軟非常喜歡與連結串列相關的題目,
因此在微軟的面試題中,連結串列出現的概率相當高。
76.複雜連結串列的複製
題目:有一個複雜連結串列,其結點除了有一個m_pNext指標指向下一個結點外,
還有一個m_pSibling指向連結串列中的任一結點或者NULL。其結點的C++定義如下:
struct ComplexNode
{
int m_nValue;
ComplexNode* m_pNext;
ComplexNode* m_pSibling;
};
下圖是一個含有5個結點的該型別複雜連結串列。
圖中實線箭頭表示m_pNext指標,虛線箭頭表示m_pSibling指標。為簡單起見,
指向NULL的指標沒有畫出。
請完成函式ComplexNode* Clone(ComplexNode* pHead),以複製一個複雜連結串列。
分析:在常見的資料結構上稍加變化,這是一種很新穎的面試題。
要在不到一個小時的時間裡解決這種型別的題目,我們需要較快的反應能力,
對資料結構透徹的理解以及紮實的程式設計功底。
77.關於連結串列問題的面試題目如下:
1.給定單連結串列,檢測是否有環。
使用兩個指標p1,p2從連結串列頭開始遍歷,p1每次前進一步,p2每次前進兩步。
如果p2到達連結串列尾部,說明無環,
否則p1、p2必然會在某個時刻相遇(p1==p2),從而檢測到連結串列中有環。
2.給定兩個單連結串列(head1, head2),檢測兩個連結串列是否有交點,如果有返回第一個交點。
如果head1==head2,那麼顯然相交,直接返回head1。
否則,分別從head1,head2開始遍歷兩個連結串列獲得其長度len1與len2,假設len1>=len2,
那麼指標p1由head1開始向後移動len1-len2步,指標p2=head2,
下面p1、p2每次向後前進一步並比較p1p2是否相等,如果相等即返回該結點,
否則說明兩個連結串列沒有交點。
3.給定單連結串列(head),如果有環的話請返回從頭結點進入環的第一個節點。
運用題一,我們可以檢查連結串列中是否有環。
如果有環,那麼p1p2重合點p必然在環中。從p點斷開環,
方法為:p1=p, p2=p->next, p->next=NULL。
此時,原單連結串列可以看作兩條單連結串列,一條從head開始,另一條從p2開始,
於是運用題二的方法,我們找到它們的第一個交點即為所求。
4.只給定單連結串列中某個結點p(並非最後一個結點,即p->next!=NULL)指標,刪除該結點。
辦法很簡單,首先是放p中資料,然後將p->next的資料copy入p中,接下來刪除p->next即可。
5.只給定單連結串列中某個結點p(非空結點),在p前面插入一個結點。
辦法與前者類似,首先分配一個結點q,將q插入在p後,接下來將p中的資料copy入q中,
然後再將要插入的資料記錄在p中。
78.連結串列和陣列的區別在哪裡?
分析:主要在基本概念上的理解。
但是最好能考慮的全面一點,現在公司招人的競爭可能就在細節上產生,
誰比較仔細,誰獲勝的機會就大。
79.
1.編寫實現連結串列排序的一種演算法。說明為什麼你會選擇用這樣的方法?
2.編寫實現陣列排序的一種演算法。說明為什麼你會選擇用這樣的方法?
3.請編寫能直接實現strstr()函式功能的程式碼。
//此連結串列面試題類,完。
歡迎,你對以上任何一題,提出你見解、思路、演算法。
謝謝。:D。
======================
1.關於本微軟等公司資料結構+演算法面試100題系列V0.1版的鄭重宣告
http://blog.csdn.net/v_JULY_v/archive/2010/12/02/6050133.aspx
2.完整100題,請參見,
[珍藏版]微軟等資料結構+演算法面試100題全部出爐[100題首次完整亮相]
http://blog.csdn.net/v_JULY_v/archive/2010/12/06/6057286.aspx
3.更多詳情,請參見,本人部落格:
My Blog:
http://blog.csdn.net/v_JULY_v
4.所有的資源(題目+答案)下載地址:
http://v_july_v.download.csdn.net/
5.本微軟等100題系列V0.1版,永久維護(網友,思路回覆)地址:
http://topic.csdn.net/u/20101126/10/b4f12a00-6280-492f-b785-cb6835a63dc9.html
作者宣告:
本人July對本部落格所有任何內容和資料享有版權,轉載請註明作者本人July及出處。
永遠,向您的厚道致敬。謝謝。July、二零一零年十二月十四日。