兩個鍊錶的第乙個公共結點

2021-09-26 05:51:31 字數 1482 閱讀 8270

輸入兩個鍊錶,找出它們的第乙個公共結點。

分析:兩個單鏈表如果存在第乙個公共結點,則後續結點一定都公共,

因為結點裡包含next指標,如果第乙個公共結點相同,則next必然相同,

所以第乙個公共結點後鍊錶合併。

思路1:設表1長度n,表2長度m,暴力法巢狀遍歷兩個鍊錶需要o(mn)的時間複雜度,

可以採用hash的思想將其中乙個轉存為雜湊表結構,這樣建雜湊表時間o(m),

而遍歷鍊錶時間o(n),而遍歷時查詢雜湊表的時間為o(1),因此複雜度降為o(m+n),

但需要輔助空間。(這種雜湊優化的策略是種一般性的思路,謹記!)

class solution 

//遍歷第乙個鍊錶

while(pnode1!=null)

pnode1=pnode1->next;

}return null;

}};

思路2:開始遍歷兩遍鍊錶獲取兩個表的長度,比較長度讓長的乙個先走差值個步長,

再兩個一起走。(快慢指標思想,也是鍊錶問題的一般性思路)

public class main5 

// 得到兩個鍊錶的長度

int nlength1 = getlistlength(phead1);

int nlength2 = getlistlength(phead2);

int nlengthdif = nlength1 - nlength2;

listnode plistheadlong = phead1;

listnode plistheadshort = phead2;

if (nlength2 > nlength1)

// 先在長鍊表上走幾步,再同時在兩個鍊錶上遍歷

for (int i = 0; i < nlengthdif; ++i)

plistheadlong = plistheadlong.next;

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

// 得到第乙個公共結點

listnode pfisrtcommonnode = plistheadlong;

return pfisrtcommonnode;

} public int getlistlength(listnode pnode)

return nlength; }}

class listnode

}

兩個鍊錶的第乙個公共結點

思路 獲取兩個鍊錶的長度,求的長度差n,讓長鍊表先遍歷n次,然後長鍊表和短鍊錶同時遍歷,當長鍊錶和短鍊錶相等時,即為第一公共結點。o m1 m2 public class findfirstcomnode int len1 getnodelength root1 int len2 getnodele...

兩個鍊錶的第乙個公共結點

題目 輸入兩個鍊錶,找出他們的第乙個公共結點。方法1 分別把兩個鍊錶的節點放入兩個棧裡,這樣兩個鍊錶的尾結點就位於兩個棧的棧頂,接下來比較兩個棧頂的結點是否相同。如果相同,則把棧頂彈出接著比較下乙個棧頂,直到找到最後乙個相同的結點。時間和空間複雜度都是o m n 方法2 先遍歷兩個鍊錶得到它們的長度...

兩個鍊錶的第乙個公共結點

輸入兩個鍊錶,找出它們的第乙個公共結點。分析 如果兩個單向鍊錶有公共的結點,那麼這兩個鍊錶從某乙個結點開始,他們的next結點都指向同乙個結點,但由於是單向鍊錶的結點,每個結點都只有乙個next結點,因此從第乙個公共結點開始,之後他們所有結點都是重合的,不可能出現分支。public listnode...