兩條相交的單向鍊錶,如何求他們的第乙個公共節點

2021-07-15 16:56:52 字數 1505 閱讀 1955

問題:

兩個單向鍊錶,可能存在公共節點。如何判斷是否存在公共節點,並找出它們的第乙個公共結點。

思想:1. 如果兩個鍊錶相交,則從相交點開始,後面的節點都相同,即最後乙個節點肯定相同;

2. 從頭到尾遍歷兩個鍊錶,並記錄鍊錶長度,當二者的尾節點不同,則二者肯定不相交;

3. 尾節點相同,如果a長為la,b為lb,如果la>lb,則a前la-lb個先跳過,

然後二者一起向後遍歷,直到遇到相同的節點;la

const listnode* firstcommonnode(const listnode* lista, const listnode*listb)

while(curb->next)//

求b尾節點,lb長度

if(cura != curb) return null;//

尾節點不相同,則沒有相交

//重新獲取ab的首位址

cura = lista;curb =listb;

if(la > lb)//

else

while(cura && cura!=curb)

return cura;//

返回首個相同的節點}

簡單測試**:

void createjointlist(const

string* stra, int sizea,const

string* strb ,int

sizeb,

const

string* strc,int sizec,listnode** lista,listnode** listb)//

建立兩個相交的鍊錶

for(int i=1; ii)

listnode* tmp = new listnode(strc[0

]); roota->next =tmp;

rootb->next =tmp;

for(int i=1; ii)

} listnode *heada,*headb;

const

int sizea = 6,sizeb = 7,sizec = 5

;

const

string a[sizea] = ;

//常量陣列

const

string b[sizeb] = ;

const

string c[sizec] = ;

//建立交叉鍊錶

createjointlist(a,sizea,b,sizeb,c,sizec,&heada,&headb);

//列印a

printlist(heada);

printlist(headb);

//找到交點

const listnode *node =firstcommonnode(heada, headb);

if(node !=null)

cout

<

\ncommon node : \t

"

合併兩條排序的鍊錶

題目 輸入兩個遞增排序的鍊錶,合併這兩個鍊錶並使新鍊錶中的節點仍然是遞增排序的。例如,輸入圖1中的鍊錶1和鍊錶2,則合併之後的公升序鍊錶如鍊錶3所示。鍊錶節點定義如下 圖1 合併兩個排序鍊錶的過程 解題思路 已知有兩條鍊錶,合併成一條新鍊錶,所以定義乙個指標 mergephead 指向新鍊錶。本題用...

判斷兩條鍊錶 不帶環 是否相交,如果相交,求出交點

定義鍊錶節點 typedef struct listnode node 判斷兩個鍊錶 鍊錶不帶環 有沒有相交?思路 如果兩個鍊錶相交,那麼最後乙個節點肯定是相同的 因此判斷兩個鍊錶的最後乙個節點是不是相同的就可以了 bool isintersect node first1,node first2 w...

判斷兩條鍊錶是否相交 單鏈表是否有環

相交的話,一定是y型或者v型的。所以只需要判斷兩個鍊錶最後乙個節點就可以了。問題描述 給定兩個單向列表的頭指標,比如h1 h2,判斷這兩個列表是否相關。注,這裡只討論這兩個列表均不帶環的情況。解法一 直觀的想法 估計有些人一看到這個題目,便不管三七二十一,從第乙個鍊錶開始遍歷,判斷它的每乙個節點是否...