C語言 尋找兩個單鏈表的公共節點實現與原理

2021-10-04 19:41:09 字數 1110 閱讀 1045

實現思想

實現**

有的同學在第一次看到這個題目的時候,以為公共節點,就是兩個鍊錶中節點的資料相等如下圖

很大一部分同學認為紅色框框裡面的就是相同節點,其實不然,正確的是這樣子的

兩個鍊錶指向相同位址的節點才是公共節點

因為兩個鍊錶的形狀為y型,所以最後公共節點的位址是一樣的,我們可以找到兩個鍊錶的最後乙個節點,如果最後乙個節點的位址一樣,則兩個鍊錶又公共節點,否則沒有,這樣判斷兩個鍊錶是否有公共節點很容易,但是要是輸出公共節點,時間開銷會非常龐大所以我們利用方法二

我們從頭節點開始遍歷,尋找第乙個公共節點,由於兩個鍊錶的長度可能不同,我們讓兩個鍊錶相減的出最長鍊錶多餘的部分,然後讓長度相同的兩個鍊錶,同時開始遍歷,找的位址相同的第乙個節點,則後面的節點都為公共節點,如圖

先把l的1,2節點遍歷完,讓l,p兩個節點分別從3,7開始遍歷,當找到9時這個節點為兩個鍊錶的第乙個公共節點

typedef

struct sqnode sqnode,

*sqlist;

sqlist publicnode

(sqnode* l,sqnode *p)

}else

//否則遍歷另乙個鍊錶多餘部分

}while

(l !=

null

)else

}printf

("公共節點為\n");

while

(l !=

null

)//列印後面公共節點

尋找兩個單鏈表的公共節點演算法

兩個鍊錶有公共節點,表示從某個節點之後所有的節點都相同 共享節點 即兩個鍊錶一起呈現y型 暴力遍歷 將兩個鍊錶倒置,然後遍歷兩個新鍊錶,即相當於從原來的鍊錶的尾部開始向前遍歷,直到兩個鍊錶分叉的地方結束,只是此時遍歷出來的是倒序的節點 最普遍的解法 先把較長的鍊錶多餘長度的部分遍歷完,然後再從兩個鍊...

兩個單鏈表的第乙個公共節點

題目 求兩個單鏈表的第乙個公共子節點。思路 我們可以先遍歷兩個單鏈表得到長度,然後求得兩個鍊錶長度的差值,然後讓長的那個鍊錶先走到差值長度位置,然後兩個鍊錶再同時遍歷,直到找到第乙個公共節點。struct listnode int getlistlength listnode head return...

兩個單鏈表的第乙個公共節點

輸入兩個鍊錶,找出它們的第乙個公共結點。注意因為傳入資料是鍊錶,所以錯誤測試資料的提示是用其他方式顯示的,保證傳入資料是正確的 由於單鏈表中節點只能有乙個next指標,所以兩個單鏈表相交,只能是y型的形狀,兩者的尾部重疊,第乙個重疊的節點就是我們要找的第乙個公共節點。假設鍊錶1的長度為a c,鍊錶2...