由於單鏈表的特殊性,如果某一鍊錶與另一鍊錶相交,那麼從相交的節點開始,以後兩個鍊錶的每個節點都相同,因此判斷兩個鍊錶是否相交,只需判斷每條鍊錶的最後乙個節點是否相同即可!
#include "stdafx.h"
#include
using
namespace
std;
struct list_node
;list_node* createlist(int datas,int n)
return head;
}void displaylist(list_node* head)
cout
}bool isinterseced(list_node* list1,list_node* list2)
while(p2->next)
return p1 == p2;
}int _tmain(int argc, _tchar* argv)
; list_node* list1 = createlist(datas,11);
list_node* list2 = createlist(datas,7);
displaylist(list1);
displaylist(list2);
//兩條鍊錶沒有相交時,可以安全釋放每一條鍊錶
//freelist(list1);
//freelist(list2);
cout
//讓第二個鍊錶的最後乙個節點的next指標指向第
//乙個鍊錶的第三個節點,如此則兩個鍊錶相交
list2_tail->next = list1->next->next;
cout
/兩條鍊錶相交時,安全釋放每一條鍊錶需要做更多的工作,
//否則,程式一定會崩潰
接下來,需要求取從哪乙個節點開始相交。由於兩個鍊錶相交,要麼兩條鍊錶的長度一樣,要麼一長一段(將公共部分也算入總長度中),所以我的思路是先將較長的哪一條鍊錶從頭開始跳過其比另一煉表多出來的節點的個數,到達節點a,此時長鍊表如果從節點a算起,短鍊表從頭算起,則兩條鍊錶的長度一樣,這樣,只需檢查每個對應的節點是否相同,第一相同的節點即為開始相交的節點。修改isintersection函式如下:
bool isinterseced(list_node* list1,list_node* list2,list_node** intersection_node)
int node_count2 = 1;
while(p2->next)
if(p1 != p2) return false;
int d_value = 0;
if(node_count1 >= node_count2)
else
for (int i = 0; i < d_value; ++i)
while(p1 != p2)
*intersection_node = p1;
return true;
}int _tmain(int argc, _tchar* argv)
; list_node* list1 = createlist(datas,11);
list_node* list2 = createlist(datas,7);
displaylist(list1);
displaylist(list2);
//兩條鍊錶沒有相交時,可以安全釋放每一條鍊錶
//freelist(list1);
//freelist(list2);
list_node* intersection_node = null;
cout
//讓第二個鍊錶的最後乙個節點的next指標指向第
//乙個鍊錶的第三個節點,如此則兩個鍊錶相交
從程式執行截圖可以看到,相交的節點的數值是0,兩個鍊錶中只有乙個0,且在第三個節點上,從而驗證了演算法。
如果已經知道了兩條鍊錶各自的長度,是否可以省去前面的兩次對鍊錶的遍歷呢?不能,相交後兩條鍊錶長度的差值未必就是原來兩條鍊錶長度的差值,本例中原本的鍊錶長度差值為4,而相交後差值為5.因此,在我看來,開始的兩次遍歷不可避免,整個演算法的複雜度為o(m + n),m與n為原始鍊錶的長度。
單鏈表判斷是否相交
判斷單鏈表是否有環路可以參考 單鏈表判斷環路及環路的入口 typedef int datatype 節點中資料型別 typedef struct listnode 節點資料結構 listnode typedef struct checknoode checknoode 判斷是否相交 bool che...
判斷單鏈表是否相交
二個單鏈表相交只能是y,不能是x,因為單鏈表每個節點只有乙個指標 問題描述 乙個比較經典的問題,判斷兩個鍊錶是否相交,如果相交找出他們的交點。思路 1 碰到這個問題,第一印象是採用hash來判斷,將兩個鍊錶的節點進行hash,然後判斷出節點,這種想法當然是可以的。2 當然採用暴力的方法也是可以的,遍...
判斷兩個單鏈表是否相交
首先要搞清楚單鏈表相交的概念和特點 指的是他們存在完全重合的部分,不是交叉到乙個點 不存在這種情況,可以想想為什麼 判斷其是否相交的方法有以下幾種。1 最傳統方法 雙重迴圈,依次查詢,是否有位址相同的節點,時間複雜度o list1.len list2.len 空間複雜度o 1 2 hash法 先遍歷...