每日一題之鍊錶的相交

2021-08-03 21:50:42 字數 1172 閱讀 4117

判斷兩個鍊錶是否相交,若相交,求交點:

如圖所示:

1,直接把兩個鍊錶的每乙個節點都遍歷一遍,時間複雜度:o(len1*len2)。

2,hash計數法:兩個鍊錶相交,則兩個鍊錶就會由共同的節點,而節點位址又是唯一的標識,所以判斷兩個鍊錶中是否存在位址一致的節點就可以判斷出是否相交。可以對第乙個鍊錶的節點位址進行hash排序,建立hash表,然後對第二個鍊錶的每乙個節點位址查詢hash表,如果有節點在第乙個鍊錶所建立的hash表中表現出來,那麼就說明兩個鍊錶相交,但是這個方法有不好的地方:時間複雜度:o(max(len1+len2)),並且同時還得增加o(len1)的儲存空間來儲存雜湊表。

3,如圖所示,如果兩個鍊錶相交,那麼在相交之後的多有節點都是兩個鍊錶共享的,那麼我們只需要判斷最後乙個節點是否相同就好了。時間複雜度是:o(len1+len2)。對於相交後的第乙個節點,則可以求出兩個鍊錶的長度,然後用長的減去短的得到乙個插值k,然後先讓長的鍊錶先遍歷k個節點,然後兩個鍊錶再開始比較。還可以這樣:其中乙個鍊錶首尾相連,檢測另乙個鍊錶是否存在,如果存在,則兩個鍊錶相交,而檢測出來的依賴環入口即為相交的第乙個。

**的實現:

#include#includeusing namespace std;

typedef struct node_t

node;

node *find_node(node *head1, node *head2)

node *p1, *p2;

p1 = head1;

p2 = head2;

int len1 = 0;

int len2 = 0;

int diff = 0;

while (null != p1->next)

while (null != p2->next)

if (p1 != p2) //如果最後乙個節點不相同,返回null

diff = abs(len1 - len2);

if (len1 > len2)

else

for (int i = 0; inext;

} while (p1 != p2)

return p1;

}

每日一題 4 鍊錶相交問題

判斷兩個鍊錶是否相交,若相交,求交點。假設鍊錶不帶環 pnode iscrosswithcircle pnode phead1,pnode phead2 else while pcur pret return pcur 判斷兩個鍊錶是否相交,若相交,求交點。假設鍊錶可能帶環 公升級版 int che...

每日一題 LeetCodez之旋轉鍊錶

給定乙個鍊錶,旋轉鍊錶,將鍊錶每個節點向右移動 k 個位置,其中 k 是非負數。示例 1 輸入 1 2 3 4 5 null,k 2 輸出 4 5 1 2 3 null 解釋 向右旋轉 1 步 5 1 2 3 4 null 向右旋轉 2 步 4 5 1 2 3 null 示例 2 輸入 0 1 2 ...

每日一題 反轉鍊錶

這道是牛客的題,給了鍊錶然後返回鍊錶的新表頭。拿到這道題首先肯定想到的是暴力求解,從表頭開始遍歷到尾,用尾元素作為新錶的表頭,然後遍歷尾元素的上乙個元素,鏈到新錶的最後然後不斷重複直到鍊錶的表頭鏈到新錶的尾巴 這樣有乙個很大的問題就是複雜度太高了,時間複雜度是o n n 這個時候我想到了肯定有簡單的...