C++?解決求兩個(gè)鏈表的第一個(gè)公共結(jié)點(diǎn)問(wèn)題
題目描述:
輸入兩個(gè)無(wú)環(huán)的單向鏈表,找出它們的第一個(gè)公共結(jié)點(diǎn),如果沒(méi)有公共節(jié)點(diǎn)則返回空。(注意因?yàn)閭魅霐?shù)據(jù)是鏈表,所以錯(cuò)誤測(cè)試數(shù)據(jù)的提示是用其他方式顯示的,保證傳入數(shù)據(jù)是正確的)
數(shù)據(jù)范圍: n<=1000
要求:空間復(fù)雜度 O(1),時(shí)間復(fù)雜度 O(n)
例如,輸入{1,2,3},{4,5},{6,7}時(shí),兩個(gè)無(wú)環(huán)的單向鏈表的結(jié)構(gòu)如下圖所示:

可以看到它們的第一個(gè)公共結(jié)點(diǎn)的結(jié)點(diǎn)值為6,所以返回結(jié)點(diǎn)值為6的結(jié)點(diǎn)。
輸入描述:
輸入分為是3段,第一段是第一個(gè)鏈表的非公共部分,第二段是第二個(gè)鏈表的非公共部分,第三段是第一個(gè)鏈表和二個(gè)鏈表的公共部分。 后臺(tái)會(huì)將這3個(gè)參數(shù)組裝為兩個(gè)鏈表,并將這兩個(gè)鏈表對(duì)應(yīng)的頭節(jié)點(diǎn)傳入到函數(shù)FindFirstCommonNode里面,用戶得到的輸入只有pHead1和pHead2。
返回值描述:
返回傳入的pHead1和pHead2的第一個(gè)公共結(jié)點(diǎn),后臺(tái)會(huì)打印以該節(jié)點(diǎn)為頭節(jié)點(diǎn)的鏈表。
示例:
輸入:
{1,2,3},{4,5},{6,7}
返回值:
{6,7}
說(shuō)明:
第一個(gè)參數(shù){1,2,3}代表是第一個(gè)鏈表非公共部分,第二個(gè)參數(shù){4,5}代表是第二個(gè)鏈表非公共部分,最后的{6,7}表示的是2個(gè)鏈表的公共部分
這3個(gè)參數(shù)最后在后臺(tái)會(huì)組裝成為2個(gè)兩個(gè)無(wú)環(huán)的單鏈表,且是有公共節(jié)點(diǎn)的??
解題思路:
本題考察數(shù)據(jù)結(jié)構(gòu)鏈表的使用。將兩個(gè)鏈表指針向前步進(jìn),走到頭后就錯(cuò)位繼續(xù)前進(jìn),因?yàn)閮蓚€(gè)指針行進(jìn)的速度一致,走著走著就撞一起了,如下方gif動(dòng)畫(huà)所示,很直觀。

測(cè)試代碼:
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
ListNode *a=pHead1,*b=pHead2;
while(a!=b)
{
a=a?a->next:pHead2;
b=b?b->next:pHead1;
}
return a;
}
};
補(bǔ)充
通過(guò)C++找出兩個(gè)鏈表的所有公共結(jié)點(diǎn):
// FindFirstCommandNode.cpp : 定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。
//
#include "stdafx.h"
#include <iostream>
using namespace std;
struct ListNode
{
int m_nKey;
ListNode* m_pNext;
ListNode(int i):m_nKey(i)
{
}
};
//獲取鏈表長(zhǎng)度
int GetListLength(ListNode* pHead)
{
int nLength = 0;
ListNode* pNode = pHead;
while (pNode != NULL)
{
++nLength;
pNode = pNode->m_pNext;
}
return nLength;
}
ListNode* FindFirstCommandNode(ListNode* pHead1, ListNode* pHead2)
{
int nLength1 = GetListLength(pHead1);
int nLength2 = GetListLength(pHead2);
int nLengthDif = 0;//兩個(gè)鏈表的長(zhǎng)度差
ListNode* pListHeadLong = NULL;//用于指向長(zhǎng)鏈表
ListNode* pListHeadShort = NULL;//用于指向短鏈表
//根據(jù)長(zhǎng)度判斷 鏈表指向
if (nLength1 > nLength2)
{
nLengthDif = nLength1 - nLength2;
pListHeadShort = pHead2;
pListHeadLong = pHead1;
}
else
{
nLengthDif = nLength2 - nLength1;
pListHeadLong = pHead2;
pListHeadShort = pHead1;
}
//先對(duì)長(zhǎng)鏈表進(jìn)行移動(dòng) 移動(dòng)到與短鏈表長(zhǎng)度相同的位置
for (int i = 0; i < nLengthDif; i++)
{
pListHeadLong = pListHeadLong->m_pNext;
}
//尋找公共節(jié)點(diǎn)
while (pListHeadLong !=NULL && pListHeadShort != NULL && pListHeadLong!= pListHeadShort)
{
pListHeadLong = pListHeadLong->m_pNext;
pListHeadShort = pListHeadShort->m_pNext;
}
//如果不為空 此時(shí)的pListHeadLong 與pListNodeShort為同一個(gè)節(jié)點(diǎn),返回該節(jié)點(diǎn)
if (pListHeadLong != NULL)
{
return pListHeadLong;
}
else
{
return NULL;//否則返回NULL
}
}
int _tmain(int argc, _TCHAR* argv[])
{
ListNode* head1 = new ListNode(0);
ListNode* head2 = new ListNode(1);
ListNode* node0 = new ListNode(22);
ListNode* node1 = new ListNode(2);
ListNode* node2 = new ListNode(3);
ListNode* node3 = new ListNode(4);
ListNode* node4 = new ListNode(5);
ListNode* node5 = new ListNode(6);
ListNode* node6 = new ListNode(7);
ListNode* node8 = new ListNode(6);
head1->m_pNext = node1;
node1->m_pNext = node0;
node0->m_pNext = node3;
node3->m_pNext = node5;
node5->m_pNext = node6;
node6->m_pNext = NULL;
head2->m_pNext = node2;
node2->m_pNext = node4;
node4->m_pNext = node8;
node8->m_pNext = node6;
node6->m_pNext = NULL;
cout<<"鏈表1的長(zhǎng)度為:"<<GetListLength(head1)<<endl;
cout<<"鏈表2的長(zhǎng)度為:"<<GetListLength(head2)<<endl;
ListNode* CommNode = FindFirstCommandNode(head1,head2);
if (CommNode!= NULL)
{
cout<<"公共節(jié)點(diǎn)的值為:"<<CommNode->m_nKey<<endl;
}
else
{
cout<<"沒(méi)有公共節(jié)點(diǎn)"<<endl;
}
getchar();
return 0;
}
到此這篇關(guān)于C++ 解決求兩個(gè)鏈表的第一個(gè)公共結(jié)點(diǎn)問(wèn)題的文章就介紹到這了,更多相關(guān)C++ 求兩個(gè)鏈表的公共結(jié)點(diǎn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++標(biāo)準(zhǔn)模板庫(kù)STL深入講解
STL提供了一組表示容器、迭代器、函數(shù)對(duì)象和算法的模板。容器是一個(gè)與數(shù)組類似的單元,可以存儲(chǔ)若干個(gè)值。STL容器是同質(zhì)的,即存儲(chǔ)的值的類型相同:算法是完成特定任務(wù)(如對(duì)數(shù)組進(jìn)行排序或在鏈表中查找特定值)的處方2022-12-12
VC基于ADO技術(shù)訪問(wèn)數(shù)據(jù)庫(kù)的方法
這篇文章主要介紹了VC基于ADO技術(shù)訪問(wèn)數(shù)據(jù)庫(kù)的方法,較為詳細(xì)的分析了VC使用ADO操作數(shù)據(jù)庫(kù)的相關(guān)實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10
C語(yǔ)言 詳細(xì)解析時(shí)間復(fù)雜度與空間復(fù)雜度
算法復(fù)雜度分為時(shí)間復(fù)雜度和空間復(fù)雜度。其作用: 時(shí)間復(fù)雜度是度量算法執(zhí)行的時(shí)間長(zhǎng)短;而空間復(fù)雜度是度量算法所需存儲(chǔ)空間的大小2022-04-04
Qt5中QML自定義環(huán)形菜單/環(huán)形選擇框的實(shí)現(xiàn)
本文主要介紹了Qt5中QML自定義環(huán)形菜單/環(huán)形選擇框的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
C語(yǔ)言順序表實(shí)現(xiàn)代碼排錯(cuò)
這篇文章主要介紹了C語(yǔ)言順序表實(shí)現(xiàn)方法,大家參考使用吧2013-12-12
C語(yǔ)言實(shí)現(xiàn)求梅森素?cái)?shù)的代碼與解析
這篇文章主要給大家介紹了關(guān)于利用C語(yǔ)言實(shí)現(xiàn)求梅森素?cái)?shù)的代碼與解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-12-12
詳解C語(yǔ)言中的錯(cuò)誤報(bào)告errno與其相關(guān)應(yīng)用方法
這篇文章主要介紹了C語(yǔ)言中的錯(cuò)誤報(bào)告errno與其相關(guān)應(yīng)用方法,包括errno和strerror以及perror的介紹,需要的朋友可以參考下2015-08-08

