用雜湊表判斷兩個單鏈表是否相交的問題

2021-07-13 15:00:46 字數 2362 閱讀 4943

判斷兩個單鏈表是否相交,一般有下面幾種方法:

1.遍歷第乙個鍊錶,記錄每次獲得的節點位址,然後遍歷第二個鍊錶,看記錄的節點位址是否存在第二個鍊錶中,這種方法的時間複雜度為o(n^2)。

2.對第乙個鍊錶的每個節點位址構造雜湊表,然後遍歷第二個鍊錶,查詢當前節點是否存在雜湊表中,此方式的時間複雜度為o(len1+len2)。

3.將其中乙個鍊錶首尾相接,遍歷另乙個鍊錶,如果能達到首尾相接鍊錶的頭,說明兩個鍊錶存在公共部分,時間複雜度為o(len1+len2)。

下面給出第2種方法,用雜湊表查詢的實現**。

首先定義鍊錶資料結構:

typedef

struct siglistsiglist_t;

接著構建單鏈表,這裡我把事先定義好的組數儲存的元素作為節點資料:

int

data = ;

siglist_t* head = null;

siglist_t* p;

siglist_t* q;

siglist_t* needtofind[9] = ;

for(int idx = 0; idx < 9; idx++)

else

q = p;

}

siglist_t* storercd[9] = ;
採用除留取餘法構造雜湊函式,記錄長度為9,選乙個小於或等於9的最大質數作取餘數用,這裡用7:

int hash(void* key)
接著開始構造雜湊表,這裡採用鏈位址法解決衝突,雜湊表衝突指對key1 != key2,存在f(key1)=f(key2),鏈位址法就是把key1和key2作為節點放在同乙個單鏈表中,這種表稱為同義詞子表,在雜湊表中只儲存同義詞子表的頭指標,如下圖:

最後實現利用雜湊表進行查詢:

bool searchhash(void* key)

return

false;

}

完整**:

#include 

#include

#include

using

namespace

std;

typedef

struct siglistsiglist_t;

siglist_t* storercd[9] = ;

void printdata(siglist_t* l)

cout

<< endl;

}int hash(void* key)

void inserthash(siglist_t* l);

while(tmp != null)

else

tail[addr] = p;

tmp = tmp->nextnode;

}}bool searchhash(void* key)

return

false;

}int main();

siglist_t* head = null;

siglist_t* p;

siglist_t* q;

siglist_t* needtofind[9] = ; //把每個節點的記錄儲存起來,測試查詢使用

for(int idx = 0; idx < 9; idx++)

else

q = p;

}inserthash(head);

for(int idx = 0; idx < 9; idx++)

cout

<< "search record: "

<< needtofind[7] << ",";

if(searchhash(needtofind[7]))

else

cout

<< "search record: "

<< needtofind[7]+1

<< ",";

if(searchhash(needtofind[7]+1))

else

}

這裡我沒有構造乙個新的鍊錶來測試,只是把構造第乙個鍊錶時建立的節點位址都記錄起來,用來驗證查詢是否有效。

判斷兩個單鏈表是否相交

首先要搞清楚單鏈表相交的概念和特點 指的是他們存在完全重合的部分,不是交叉到乙個點 不存在這種情況,可以想想為什麼 判斷其是否相交的方法有以下幾種。1 最傳統方法 雙重迴圈,依次查詢,是否有位址相同的節點,時間複雜度o list1.len list2.len 空間複雜度o 1 2 hash法 先遍歷...

判斷兩個單鏈表是否相交

方法一 直接法 直接判斷第乙個鍊錶的每個結點是否在第二個鍊錶中,時間複雜度為o len1 len2 耗時很大 方法二 利用計數 如 果 兩個鍊錶相交,則兩個鍊錶就會有共同的結點 而結點位址又是結點唯一標識。因而判斷兩個鍊錶中是否存在位址一致的節點,就可以知道是否相交了。可以對第一 個鍊錶的節點位址進...

判斷兩個單鏈表是否相交

判斷兩個單鏈表是否相交,如果相交,給出相交的第乙個點 兩個鍊錶都不存在環 比較好的方法有兩個 一 將其中乙個鍊錶首尾相連,檢測另外乙個鍊錶是否存在環,如果存在,則兩個鍊錶相交,而檢測出來的依賴環入口即為相交的第乙個點。二 如果兩個鍊錶相交,那個兩個鍊錶從相交點到鍊錶結束都是相同的節點,我們可以先遍歷...