14 判斷兩個單鏈表是否相交

2022-05-10 10:36:35 字數 1384 閱讀 2285

如果兩個鍊錶相交於某一節點,那麼在這個相交節點之後的所有節點都是兩個鍊錶所共有的。 也就是說,如果兩個鍊錶相交,那麼最後乙個節點肯定是共有的。 

先遍歷第乙個鍊錶,記住最後乙個節點,然後遍歷第二個鍊錶, 到最後乙個節點時和第乙個鍊錶的最後乙個節點做比較,如果相同,則相交, 

否則不相交。時間複雜度為o(len1+len2),因為只需要乙個額外指標儲存最後乙個節點位址, 空間複雜度為o(1) 

public

static

boolean

isintersect(node head1, node head2)

node tail1 =head1;

//找到鍊錶1的最後乙個節點

while (tail1.next != null

) node tail2 =head2;

//找到鍊錶2的最後乙個節點

while (tail2.next != null

)

return tail1==tail2;

}

求兩個單鏈表相交的第乙個節點 對第乙個鍊錶遍歷,計算長度len1,同時儲存最後乙個節點的位址。 

對第二個鍊錶遍歷,計算長度len2,同時檢查最後乙個節點是否和第乙個鍊錶的最後乙個節點相同,若不相同,不相交,結束。 

兩個鍊錶均從頭節點開始,假設len1大於len2 

那麼將第乙個鍊錶先遍歷len1-len2個節點,此時兩個鍊錶當前節點到第乙個相交節點的距離就相等了,然後一起向後遍歷,直到兩個節點的位址相同。 

時間複雜度,o(len1+len2) 

//

方法:求兩個單鏈表相交的第乙個交點

public

static

node getfirstcommonnode(node head1, node head2)

int len1 = 1;

node tail1 =head1;

while (tail1.next != null

)

int len2 = 1;

node tail2 =head2;

while (tail2.next != null

)

//不相交直接返回null

if (tail1.data !=tail2.data)

node n1 =head1;

node n2 =head2;

//略過較長鍊錶多餘的部分

if (len1 >len2)

} else

}//一起向後遍歷,直到找到交點

while (n1 !=n2)

return

n1; }

**:

判斷兩個單鏈表是否相交

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

判斷兩個單鏈表是否相交

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

判斷兩個單鏈表是否相交

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