(一)題目:輸入乙個單項鍊表,找出該鍊錶的倒數第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 ...