鍊錶分為有環和無環,如果兩個鍊錶存在相交,則只有兩種可能,兩個鍊錶都無環或者都有環。
下面分別討論。
2.1定義鍊錶
//單向鍊錶
public
static
class
linknode
}
2.2判斷是否有環
判斷是否有環,有環返回入口點,無環返回null。
public
static linknode isloop
(linknode node)
linknode slow = node;
linknode fast = node;
while
(slow.next!=null && fast.next!=null)
/** * 特別注意:
* 如果存在迴圈,則在慢指標走完環前,總會和快指標相遇,因為快指標比慢指標快一倍哦
* 從頭指標和相遇點同時向後走,相遇的點必定是入口點。(這裡要好好思考一下)
* 比如起點是a,入口點b,相遇點c,環一圈距離記為l,相遇是快指標比慢指標多走一圈,故ac = l,
* ac - bc = l - bc,所以ab = l - bc,即下次相遇的點必定是入口點b
兩個無環鏈表比較,返回第乙個交點,不相交返回null
private
static linknode getnoloop
(linknode head1, linknode head2)
//第二個鍊錶的最後乙個元素
while
(temp2.next!= null)
//尾部不同,沒有相交的點
if(temp1.data !=temp2.data)
//相交情況
int cur = math.
abs(len1-len2)
;//長度差
//temp1記錄長的鍊錶,temp2記錄短的鍊錶
if(len1>len2)
else
for(
int i =
0; i < cur; i++
)//判斷鍊錶是否相同,相同則停止迴圈(這裡指兩個鍊錶各個節點資料是否相同,
//不是鍊錶是否相同,這裡省略比較
while
(temp1!=temp2)
return temp1;
}
有環鏈表相交分兩種情況:
case1:入口點相同(可轉化為無環)
case2:入口點不同
分別討論:
private
static linknode getbothloop
(linknode head1, linknode loop1, linknode head2, linknode loop2)
//第二個鍊錶的最後乙個元素
while
(temp2.next!= loop2)
//相交情況
int cur = math.
abs(len1-len2)
;//長度差
//temp1記錄長的鍊錶,temp2記錄短的鍊錶
if(len1>len2)
else
for(
int i =
0; i < cur; i++
)while
(temp1!=temp2)
return temp1;
}else
else
}return null;
}}
判斷兩個單向鍊錶是否相交
給定兩個 單向 鍊錶,判定它們是否相交並返回交點。請注意相交的定義基於節點的引用,而不是基於節點的值。換句話說,如果乙個鍊錶的第k個節點與另乙個鍊錶的第j個節點是同一節點 引用完全相同 則這兩個鍊錶相交。首先最容易想到暴力搜尋,對a鏈的每乙個節點,都對b鍊錶進行遍歷搜尋看是否相同 public li...
六 判斷兩個單向鍊錶是否相交
判斷兩個單向鍊錶是否相交,有兩種情況,一種是兩個不帶環的單向鍊錶相交,一種是兩個帶環的單向鍊錶相交。情況1 兩個不帶環的單向鍊錶相交 判斷兩個不帶環的單向鍊錶是否相交。時間複雜度o n 空間複雜度o 1 思路 如果兩個沒有環的鍊錶相交於某一節點,那麼在這個節點之後的 所有節點都是兩個鍊錶共有的,如果...
判斷兩個鍊錶是否相交
思路1 最暴力的辦法,針對鍊錶1的每乙個節點,判斷其是否也在鍊錶2中,複雜度o n m 明顯不是乙個好方法。思路2 給每個節點增加乙個標記量,可以是附在鍊錶中的成員,也可以是另外的乙個結構,例如用乙個陣列來儲存。先遍歷鍊錶1,標記出遍歷過的節點,再遍歷鍊錶2,如果發現某個節點已經被遍歷過,則說明相交...