如果兩個鍊錶相交於某一節點,那麼在這個相交節點之後的所有節點都是兩個鍊錶所共有的。 也就是說,如果兩個鍊錶相交,那麼最後乙個節點肯定是共有的。
先遍歷第乙個鍊錶,記住最後乙個節點,然後遍歷第二個鍊錶, 到最後乙個節點時和第乙個鍊錶的最後乙個節點做比較,如果相同,則相交,
否則不相交。時間複雜度為o(len1+len2),因為只需要乙個額外指標儲存最後乙個節點位址, 空間複雜度為o(1)
publicstatic
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 耗時很大 方法二 利用計數 如 果 兩個鍊錶相交,則兩個鍊錶就會有共同的結點 而結點位址又是結點唯一標識。因而判斷兩個鍊錶中是否存在位址一致的節點,就可以知道是否相交了。可以對第一 個鍊錶的節點位址進...
判斷兩個單鏈表是否相交
判斷兩個單鏈表是否相交,如果相交,給出相交的第乙個點 兩個鍊錶都不存在環 比較好的方法有兩個 一 將其中乙個鍊錶首尾相連,檢測另外乙個鍊錶是否存在環,如果存在,則兩個鍊錶相交,而檢測出來的依賴環入口即為相交的第乙個點。二 如果兩個鍊錶相交,那個兩個鍊錶從相交點到鍊錶結束都是相同的節點,我們可以先遍歷...