3 6 程式設計判斷兩個鍊錶是否相交

2021-07-02 05:49:31 字數 1589 閱讀 5661

(一)題目:輸入乙個單項鍊表,找出該鍊錶的倒數第k個節點。

解法:設立兩個指標,先讓第乙個指標先往前走k步,然後第二個指標放到鍊錶開頭。

然後兩個鍊錶一起往後走,當第乙個鍊錶到達鍊錶尾部的時候,後面那個鍊錶所在的位置就剛好是鍊錶的倒數第k個節點!

**:

struct node ;

node* funtion(node *head, int k)

if(k > 0) return null;

while(ptwo != null)

return pone;

}

(二)題目:給定兩個單項鍊表,給定這兩個單項鍊表的頭指標,程式設計判斷這兩個鍊錶是否相交。

方法:因為兩個鍊錶如果相交的話,那麼從相交節點開始,到最後,這兩個鍊錶的後面的部分都是公共的部分!

所以,只需要分別從兩個鍊錶開頭,遍歷到最後結尾處,看看兩個尾部是不是相同的乙個節點!如果是的話,說明這兩個鍊錶是相交的,如果不是的話,說明這兩個     鍊錶是不相交的。

題目:上面說的這種方法是兩個鍊錶都不帶環,但是如果煉錶帶了環呢!?

所以總的方法:

(1)先判斷兩個鍊錶帶不帶環

(2)如果都不帶環,就判斷兩個鍊錶的尾節點是否相等。

(3)如果都帶環,判斷一煉表上兩個指標相遇的那個節點,在不在另外一條鍊錶上。如果在的話,則兩個鍊錶相交。如果不在的話,則不相交。

**:

struct node ;

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

if(fast == slow && fast && slow) else return false;

}bool detect(node *head1, node *head2)

return false;

}return false;

}

(三)求兩個鍊錶相交的第乙個節點

方法,思路:先求出更長的那個鍊錶的,然後在這個鍊錶上面先走長度之差的步數,然後兩個指標在一起走,走到最後,既是同乙個節點!

struct node ;

unsigned int listlength(node *phead)

return nlength;

}node* findfirstcommonnode(node *phead1, node *phead2)

for(int i = 0; i < nlengthdiff; ++i) plistheadlong = plistheadlong -> pnext;

while(plistheadlong != null && plistheadshort != null && plistheadlong != plistheadshort)

node *pfirstcommonnode = null;

if(plistheadlong == plistheadshort) pfirstcommonnode = plistheadlong;

return pfirstcommonnode;

}

程式設計之美 3 6 判斷兩個鍊錶是否相交

問題描述 給出兩個單向鍊錶的頭指標 h1,h2 判斷這兩個鍊錶是否相交。假設兩個鍊錶均不帶環。解法一 直觀的想法 判斷第乙個鍊錶胡每乙個節點是否在第二個鍊錶中。時間複雜度為o length h1 length h2 解法二 利用計數的方法 如果兩個鍊錶相交,就會有共同的節點。我們可以把第乙個鍊錶的節...

程式設計之美 3 6 程式設計判斷兩個鍊錶是否相交

1.簡述 給出兩個鍊錶的頭指標,比如h1,h2,判斷這兩個鍊錶是否相交。這裡是為了簡化問題,我們假設兩個鍊錶不帶環。擴充套件 如果鍊錶可能有環呢?擴充套件 如何求出兩個相交鍊錶的相交的第乙個節點。2.分析 這道題,個人感覺理解的還是相對比較清楚完整。主要就是兩個問題,問題一,兩個鍊錶是否相交,問題二...

程式設計判斷兩個鍊錶是否相交

程式設計之美 3.6節 判斷兩個鍊錶是否相交 問題 給出兩個單項鍊表的頭指標,判斷這兩個鍊錶是否相交,假設都不帶環。解法 遍歷第乙個鍊錶至尾節點,然後遍歷第二個鍊錶,如果尾節點和剛才相同,則說明相交,否則不想交。includeusing namespace std struct node bool ...