描述
輸入兩個無環(huán)的單向鏈表,找出它們的第一個公共結(jié)點(diǎn),如果沒有公共節(jié)點(diǎn)則返回空汇荐。(注意因?yàn)閭魅霐?shù)據(jù)是鏈表洞就,所以錯誤測試數(shù)據(jù)的提示是用其他方式顯示的,保證傳入數(shù)據(jù)是正確的)
數(shù)據(jù)范圍: n≤1000
要求:空間復(fù)雜度 O(1)掀淘,時(shí)間復(fù)雜度 O(n)
例如旬蟋,輸入{1,2,3},{4,5},{6,7}時(shí),兩個無環(huán)的單向鏈表的結(jié)構(gòu)如下圖所示:
可以看到它們的第一個公共結(jié)點(diǎn)的結(jié)點(diǎn)值為6革娄,所以返回結(jié)點(diǎn)值為6的結(jié)點(diǎn)咖为。
輸入描述:
輸入分為是3段,第一段是第一個鏈表的非公共部分稠腊,第二段是第二個鏈表的非公共部分匣摘,第三段是第一個鏈表和第二個鏈表的公共部分痴奏。 后臺會將這3個參數(shù)組裝為兩個鏈表找默,并將這兩個鏈表對應(yīng)的頭節(jié)點(diǎn)傳入到函數(shù)FindFirstCommonNode里面冠蒋,用戶得到的輸入只有pHead1和pHead2攘已。
返回值描述:
返回傳入的pHead1和pHead2的第一個公共結(jié)點(diǎn)幽纷,后臺會打印以該節(jié)點(diǎn)為頭節(jié)點(diǎn)的鏈表沐寺。
示例1
輸入:{1,2,3},{4,5},{6,7}
返回值:{6,7}
說明:第一個參數(shù){1,2,3}代表是第一個鏈表非公共部分牲览,第二個參數(shù){4,5}代表是第二個鏈表非公共部分挠羔,最后的{6,7}表示的是2個鏈表的公共部分井仰,這3個參數(shù)最后在后臺會組裝成為2個兩個無環(huán)的單鏈表,且是有公共節(jié)點(diǎn)的
示例2
輸入:{1},{2,3},{}
返回值:{}
說明:2個鏈表沒有公共節(jié)點(diǎn) ,返回null破加,后臺打印{}
解題思路:pHead1->pHead2 pHead2->pHead1
1俱恶、定義兩個ListNode節(jié)點(diǎn),分別指向pHead1,pHead2;
2范舀、while循環(huán)條件的結(jié)束條件是first和second相等合是,包括空;
3锭环、兩個結(jié)點(diǎn)同時(shí)向前走聪全,每個節(jié)點(diǎn)先走當(dāng)前鏈表的每個節(jié)點(diǎn),再去走另外鏈表的每個的節(jié)點(diǎn)辅辩,當(dāng)first走到末尾時(shí)难礼,走pHead2,second走到末尾時(shí)走pHead1
3、若有公共結(jié)點(diǎn)玫锋,跳出while循環(huán)蛾茉,若沒有公共結(jié)點(diǎn),走到first和second都為空時(shí)景醇,也會結(jié)束while循環(huán)臀稚。
代碼實(shí)現(xiàn):
public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
ListNode first = pHead1;
ListNode second = pHead2;
while(first != second){
if(first == null){
first = pHead2;
}else{
first = first.next;
}
if(second == null){
second = pHead1;
}else{
second = second.next;
}
}
return first;
}