輸入兩個無環(huán)的單向鏈表到涂,找出它們的第一個公共結(jié)點鞭盟,如果沒有公共節(jié)點則返回空。(注意因為傳入數(shù)據(jù)是鏈表脉幢,所以錯誤測試數(shù)據(jù)的提示是用其他方式顯示的,保證傳入數(shù)據(jù)是正確的)
數(shù)據(jù)范圍: n≤1000
要求:空間復(fù)雜度O(1)嗦锐,時間復(fù)雜度O(n)
例如嫌松,輸入{1,2,3},{4,5},{6,7}時,兩個無環(huán)的單向鏈表的結(jié)構(gòu)如下圖所示:
可以看到它們的第一個公共結(jié)點的結(jié)點值為6奕污,所以返回結(jié)點值為6的結(jié)點萎羔。
輸入描述:
輸入分為是3段,第一段是第一個鏈表的非公共部分碳默,第二段是第二個鏈表的非公共部分贾陷,第三段是第一個鏈表和第二個鏈表的公共部分。 后臺會將這3個參數(shù)組裝為兩個鏈表腻窒,并將這兩個鏈表對應(yīng)的頭節(jié)點傳入到函數(shù)FindFirstCommonNode里面昵宇,用戶得到的輸入只有pHead1和pHead2。
返回值描述:
返回傳入的pHead1和pHead2的第一個公共結(jié)點儿子,后臺會打印以該節(jié)點為頭節(jié)點的鏈表瓦哎。
# 示例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é)點的
# 示例2
輸入:
{1},{2,3},{}
返回值:
{}
說明:
2個鏈表沒有公共節(jié)點 ,返回null,后臺打印{}
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*
* C語言聲明定義全局變量請加上static愉适,防止重復(fù)定義
*/
/**
*
* @param pHead1 ListNode類
* @param pHead2 ListNode類
* @return ListNode類
*/
struct ListNode* FindFirstCommonNode(struct ListNode* pHead1, struct ListNode* pHead2 ) {
// write code here
// pHead1 or pHead2 is null
if(pHead1 == NULL || pHead2 == NULL)
{
return NULL;
}
// same speed, same length, so must be meet in after.
struct ListNode * move1 = pHead1;
struct ListNode * move2 = pHead2;
while(move1->val != move2->val)
{
move1 = move1->next;
move2 = move2->next;
// no pn, when both are null
if(move1 == NULL && move2 == NULL)
{
return NULL;
}
if(move1 == NULL)
{
move1 = pHead2;
}
if(move2 == NULL)
{
move2= pHead1;
}
}
return move1;
}