鍊錶問題 兩個鍊錶的第乙個公共節點

2021-08-21 03:04:43 字數 1317 閱讀 2953

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

分析:對於這個問題有三種思路:

1、蠻力演算法,當遍歷到乙個節點時,就在另外乙個鍊錶上順序遍歷,並且判斷是否相等,如果想等就是第乙個重合的節點,對於兩個長度分別為m和n的鍊錶,所需要的時間為o(m*n)。實現如下:

struct listnode 

};/*蠻力解法*/

listnode* findfirstcommonnode(listnode* phead1, listnode* phead2)

while (pnode2)

pnode1 = pnode1->next;

}return null;

}

2、由於兩個鍊錶有公共節點,則在第乙個公共節點之後,所有的節點都是重合的,所以可以倒著判斷,每次判斷兩個節點是否想等,當遇到第乙個不等的節點時,就可以得到該結點的next就為這兩個鍊錶的第乙個公共節點,這裡為了從末尾到頭開始訪問借助棧結構,相當於花費o(m+n)的空間,是用空間來換時間的方法,實現如下:

listnode* findfirstcommonnode(listnode* phead1, listnode* phead2)

while (pnode2)

while (node1.size() > 0 && node2.size() > 0)

else

return node1.top()->next;

}return null;

}

3、當兩個長度想等時,可以很自然的想到,可以通過同時在兩個鍊錶上遍歷,當遇到第乙個相等的節點就是第乙個公共節點,借助於這種想法,當兩個鍊錶長度不相等時,我們可以先算出兩個鍊錶的長度差diff,讓指標先在長的鍊錶上走diff步,然後這兩個指標同時開始走就可以解決長短不同的情況,這樣再不用輔助空間的情況下,時間效率可以達到o(m+n)。具體的實現如下:

//o(n),不需要輔助空間

listnode* findfirstcommonnode(listnode* phead1, listnode* phead2)

while (pnode_long)

diff = length2 - length1;

pnode_short = phead1;

pnode_long = phead2;

if (length2 < length1)

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

while (pnode_long&&pnode_short)

return null;

}

兩個鍊錶第乙個公共節點

先讓長的鍊錶的指標先走長的之差的步數,兩個再一起走,如果相遇就是第乙個公共節點 如果沒交點,就都走到空 struct listnode class solution while pl2 null 復位指標到頭節點 pl1 phead1 pl2 phead2 int dif len 0 if len1...

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

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

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

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