一癞季、如何找到兩個鏈表的交點
兩個鏈表有以下3種情況:
(1)相交
(2)平行
(3)屬于
其中鏈表A劫瞳、B長度未知
可以設(shè)鏈表A到相交節(jié)點長度為,鏈表B到相交節(jié)點長度為
绷柒。對于特殊情況(2)
志于,
分別為鏈表A、B長度废睦;對于特殊情況(3)
伺绽。
如果將鏈表AB連接,所得到的鏈表AB和鏈表BA長度必然相等嗜湃。
若設(shè)鏈表A奈应、B公共節(jié)點長度為s,公共節(jié)點為C购披,C在AB中出現(xiàn)的位置有杖挣。在BA中出現(xiàn)的位置有
。因此刚陡,令指針
先遍歷A再遍歷B惩妇,指針
先遍歷B再遍歷A,則兩個指針必定在交點相遇筐乳。
二歌殃、如何判斷鏈表中是否有環(huán)
可以使用快慢指針。假設(shè)B以A兩倍速度繞操場跑步蝙云,那么B最終一定會追上A挺份。判斷有環(huán)也是同理。
假設(shè)鏈表L到環(huán)的起點長度為x贮懈,環(huán)的長度為m匀泊,環(huán)起點為T。
慢指針slow每次前進一步朵你,快指針fast每次前進兩步各聘。則當(dāng)slow到達環(huán)的起點時,fast在環(huán)中前進了x步抡医。距離再次回到T長度為(m-x%m)躲因。
此時,等同于fast落后slow指針(m-x%m)步忌傻。已知fast速度是slow兩倍大脉。可得fast和slow必定在節(jié)點T后(m-x%m)步相遇水孩。
可得镰矿,若快慢指針相遇,則有環(huán)俘种;否則秤标,沒有環(huán)。
三宙刘、找到環(huán)的起始節(jié)點
由二可得苍姜,fast和slow必定在節(jié)點T后(m-x%m)步相遇。
m-x%m=m-(x-nm)=(n+1)m-x
即還差x步可以繞環(huán)走n+1圈悬包。
那么在找到相遇節(jié)點后衙猪,令另一個指針start從起始節(jié)點出發(fā),與slow指針同步前進布近,走x步后正好與slow指針在環(huán)起始節(jié)點相遇垫释。