鍊錶追趕問題

2021-07-02 06:07:56 字數 2093 閱讀 5869

題目:輸入乙個單向鍊錶,輸出該鍊錶中倒數第k個結點,鍊錶的倒數第0個結點為鍊錶的尾指標

分析:首先這個鍊錶時單向鍊錶,並且我們也不知道鍊錶的長度,那麼僅僅憑藉乙個指標來找到倒數第k個節點,就需要知道鍊錶的長度,因此需要先遍歷整個鍊錶,得到鍊錶的長度過後,然後再從頭結點開始尋找,這種方法顯然很笨,那麼我們可以用比較簡單的方法嗎?答案是肯定的,若當乙個指標直到最後乙個節點為乙個flag,我們就可以知道另外乙個指標已經指到了倒數第k個節點時,就可以很簡單的解決這個問題,正好可以使用快慢指標方法。

> 快慢指標:還可以用於判斷鍊錶時否有環。

elemtype returnkvalue(linklist list, int k) 

while(q->next != null)

return p->data;

}

題目描述:給出兩個單向鍊錶的頭指標(如下圖所示),

比如h1、h2,判斷這兩個鍊錶是否相交。這裡為了簡化問題,我們假設兩個鍊錶均不帶環。

要想判斷兩個鍊錶是否相交,其實方法有很多種:

暴力法:即將鍊錶2中的每乙個節點都與鍊錶1中的每乙個節點相比較,若存在相等的節點,那麼兩個鍊錶即相交,這種方法的複雜度為o(length(list1)*length(list2);

將鍊錶2新增到鍊錶1的末尾,然後判斷新的鍊錶是否存在環,若存在環則表明兩個鍊錶相交(這種方法僅僅侷限於兩個鍊錶都無環的情況);

針對第乙個鍊錶直接構造hash表,然後檢查第二個鍊錶中的每乙個節點是否在該hash表中,若存在鍊錶在hash表中,則表明兩個鍊錶相交,該方法的;

如上圖所示,若兩個鍊錶相交,那麼相交節點之後的節點都應該相同,因此我們只需要判斷最後兩個鍊錶的最後乙個節點是否相同即可,若相同則相交(鍊錶無環)。

bool checklistintersect(linklist list1, linklist list2)
上面的方法是已知兩個鍊錶都無環的判斷情況,那麼現在我們不知道兩個鍊錶是否有環,該如何判斷兩個鍊錶是否相交呢?

首先判斷兩個鍊錶是否有環:若乙個鍊錶有環,而乙個鍊錶無環,那麼兩個鍊錶肯定不相交,若兩個鍊錶都無環則可以使用上面的方法;

若兩個鍊錶都有環,那麼就求出其中乙個鍊錶上倆指標相遇的節點,然後檢查該節點是否在另外乙個鍊錶上,若在,那麼兩個鍊錶相交,若不在,則兩個鍊錶不相交。

檢測鍊錶是否有環:

bool iscircle(node * head, node *& circlenode, node *& lastnode)    

if(fast == slow && fast && slow)

else

return false;

}

判斷兩個鍊錶是否相交:

bool detect(node * head1, node * head2)  

//兩個都有環,判斷環裡的節點是否能到達另乙個鍊錶環裡的節點

else

return false;

} return false;

}

注:求環和該****july部落格:

擴充套件:求兩個鍊錶相交的第乙個節點

思路:首先判斷兩個鍊錶的尾節點是否相等,若相等,則兩個鍊錶必定相交。由於相交的部分是等長的,因此我們可以先判斷兩個鍊錶的長度,若等長,則從第乙個節點開始比較,第乙個相等的節點即為相交的第乙個節點;若不等長呢?這時候我們就可以使用快慢指標:讓長的乙個鍊錶先走length(long)-length(short)步,因為在開始出長的部分肯定不存在相交的節點,這樣就可以先等長兩個鍊錶,然後通過上述的方法來求第乙個節點。

關於鍊錶追趕 鍊錶中環的問題

關於環的問題,介紹幾個個經典的題目 1.求鍊錶倒數第k個結點 最經典,最常見的解法就是,設定兩個指標p1,p2,一開始分別指向頭結點,首先p2先移動k個節點,之後開始p1,p2每次移動1個節點,直到p2達到最後乙個節點位置,那麼p1指向的就是倒數第k個節點。不過這種解法主要是針對單鏈表,且鍊錶中不存...

(9)鍊錶追趕

include using namespace std 認真分析具體情況,當把問題分析透了時,解決方案也就一目了然了 1.如果兩個都沒有環 看結尾節點是否相同 2.如果乙個有環,乙個沒有,則必定分離 3.如果兩個都有環 node1,node2 分別是入環節點 看是否能從node1遍歷到node2 如...

鍊錶 鍊錶環問題總結

給定乙個單鏈表,只給出頭指標h 1 如何判斷是否存在環?2 如何知道環的長度?3 如何找出環的連線點在 4 帶環鍊錶的長度是多少?1 如何判斷是否存在環?對於問題1,使用追趕的方法,設定兩個指標slow fast,從頭指標開始,每次分別前進1步 2步。如存在環,則兩者相遇 如不存在環,fast遇到n...