在本題中,單鏈表可能有環,也可能無環。給定兩個單鏈表的頭節點 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指標,只...