判斷兩個單鏈表是否相交,一般有下面幾種方法:
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 耗時很大 方法二 利用計數 如 果 兩個鍊錶相交,則兩個鍊錶就會有共同的結點 而結點位址又是結點唯一標識。因而判斷兩個鍊錶中是否存在位址一致的節點,就可以知道是否相交了。可以對第一 個鍊錶的節點位址進...
判斷兩個單鏈表是否相交
判斷兩個單鏈表是否相交,如果相交,給出相交的第乙個點 兩個鍊錶都不存在環 比較好的方法有兩個 一 將其中乙個鍊錶首尾相連,檢測另外乙個鍊錶是否存在環,如果存在,則兩個鍊錶相交,而檢測出來的依賴環入口即為相交的第乙個點。二 如果兩個鍊錶相交,那個兩個鍊錶從相交點到鍊錶結束都是相同的節點,我們可以先遍歷...