演算法學習12 兩個單鏈表相交的一系列問題

2021-10-20 18:55:38 字數 2097 閱讀 9764

在本題中,單鏈表可能有環,也可能無環。給定兩個單鏈表的頭節點 head1和head2,這兩個鍊錶可能相交,也可能不相交。請實現乙個函式, 如果兩個鍊錶相交,請返回相交的第乙個節點;如果不相交,返回null 即可。 要求:如果鍊錶1的長度為n,鍊錶2的長度為m,時間複雜度請達到 o(n+m),額外空間複雜度請達到o(1)。

分析首先要判斷這兩個單鏈表是否有環。因為有環的情況下需要單獨討論。若兩個鍊錶都沒環,有可能相交也有可能不相交,相交時,末節點必定為同乙個。若兩個都有環,則需要分三種情況討論,不相交,有共同的入環節點 不同的入環節點。

**首先判斷單鏈表是否有環,若有環返回入環節點,若無環,返回null。

先讓快慢指標在環中相遇,若某個節點的指標域為空,必然無環,返回null。若不存在節點指標域為null,則必然存在乙個節點使得快慢指標在此相遇,此時,將快指標指向煉表頭結點,快慢指標同時每次移動乙個節點,當兩個指標再次相遇,該節點就是入環節點。

listnode*

getloopnode

(listnode* head)

listnode* fast = head-

>next-

>next;

listnode* slow = head-

>next;

while

(fast != slow)

fast = fast-

>next-

>next;

slow = slow-

>next;

} fast = head;

while

(fast != slow)

return fast;

}listnode*

noloop

(listnode* head1, listnode* head2)

int n =0;

listnode* cur1 = head1;

listnode* cur2 = head2;

while

(cur1-

>next !=

null

)while

(cur2-

>next !=

null

) cur1 = n >

0? head1 : head2;

cur2 = cur1 == head1 ? head2 : head1;

int n =

abs(n)

;while

(n--

)while

(cur1 != cur2)

return cur1;

}listnode*

bothloop

(listnode* head1, listnode* loop1, listnode* head2, listnode* loop2)

while

(cur2 != loop2)

cur1 = n >

0? head1 : head2;

cur2 = cur1 == head1 ? head2 : head1;

int n =

abs(n)

;while

(n--

)while

(cur1 != cur2)

return cur1;

}else

cur1 = cur1-

>next;

}return

null;}

}listnode*

getintersecnode

(listnode* head1, listnode* head2)

listnode* loop1 =

getloopnode

(head1)

; listnode* loop2 =

getloopnode

(head2);if

(loop1 ==

null

&& loop2 ==

null)if

(loop1 !=

null

&& loop2 !=

null

)return

null

;}

兩個單鏈表相交問題

關於兩個鍊錶相交,很容易遷移到好多地方,比如 1.找出兩個鍊錶相交的節點 2.判斷單個鍊錶是否有環等 3.二叉樹當存在父指標的時候,求樹中兩個節點的最近公共祖先 看乙個圖 一下只給出相當一部分思想 方法一 將兩個鍊錶的節點進行hash操作,然後判斷出節點,這種想法是可以的。方法二 當然採用暴力的方法...

兩個單鏈表相交的系列問題

在本題中,單鏈表可能有環,也可能無環。給定兩個單鏈表的頭節點 head1和head2,這兩個鍊錶可能相交,也可能不相交。請實現乙個函式,如果兩個鍊錶相交,請返回相交的第乙個節點 如果不相交,返回null 即可。要求 如果鍊錶1的長度為n,鍊錶2的長度為m,時間複雜度請達到 o n m 額外 空間複雜...

兩個單鏈表相交,求開始相交的點

這題如果求兩個鍊錶是否相交,或者求相交的終點好求,要求開始相交的點,不好求。剛開始我的思路一直停留再相交的終點做文章,比如,1 知道終點,就知道終點的上乙個點,判斷它是不是,再找上上乙個點,以此類推。可惜這是個單鏈表,不能逆向遍歷。使用這種辦法,就需要遍歷n遍,效率太太低。2 終點的next指標,只...