判斷兩個單向鍊錶是否相交

2021-10-03 09:51:00 字數 2037 閱讀 1602

鍊錶分為有環和無環,如果兩個鍊錶存在相交,則只有兩種可能,兩個鍊錶都無環或者都有環。

下面分別討論。

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,如果發現某個節點已經被遍歷過,則說明相交...