最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++?解決求兩個(gè)鏈表的第一個(gè)公共結(jié)點(diǎn)問(wèn)題

 更新時(shí)間:2021年12月08日 08:41:00   作者:翟天保Steven  
本文主要介紹了利用C++實(shí)現(xiàn)輸入兩個(gè)無(wú)環(huán)的單向鏈表時(shí),找出它們的第一個(gè)公共結(jié)點(diǎn)的問(wèn)題。文章中的示例代碼簡(jiǎn)潔易懂,感興趣的同學(xué)可以和小編一起學(xué)習(xí)一下

題目描述:

輸入兩個(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語(yǔ)言中的函數(shù)、數(shù)組與指針

    詳解C語(yǔ)言中的函數(shù)、數(shù)組與指針

    這篇文章主要介紹了C語(yǔ)言中的函數(shù)、數(shù)組與指針,本文給大家介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-02-02
  • C語(yǔ)言實(shí)現(xiàn)小學(xué)生計(jì)算機(jī)輔助教學(xué)系統(tǒng)

    C語(yǔ)言實(shí)現(xiàn)小學(xué)生計(jì)算機(jī)輔助教學(xué)系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)小學(xué)生計(jì)算機(jī)輔助教學(xué)系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • C++深入探究類與對(duì)象之友元與運(yùn)算符重載

    C++深入探究類與對(duì)象之友元與運(yùn)算符重載

    友元就是讓一個(gè)函數(shù)或者類,訪問(wèn)另一個(gè)類中的私有成員;打個(gè)比方,這相當(dāng)于是說(shuō):朋友是值得信任的,所以可以對(duì)他們公開(kāi)一些自己的隱私,運(yùn)算符重載的實(shí)質(zhì)就是函數(shù)重載或函數(shù)多態(tài),運(yùn)算符重載是一種形式的C++多態(tài),目的在于讓人能夠用同名的函數(shù)來(lái)完成不同的基本操作
    2022-04-04
  • C++字符串拼接效率對(duì)比(+=、append、stringstream、sprintf)

    C++字符串拼接效率對(duì)比(+=、append、stringstream、sprintf)

    這篇文章主要介紹了C++字符串拼接效率對(duì)比(+=、append、stringstream、sprintf),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • C語(yǔ)言實(shí)現(xiàn)帶頭雙向循環(huán)鏈表的接口

    C語(yǔ)言實(shí)現(xiàn)帶頭雙向循環(huán)鏈表的接口

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)帶頭雙向循環(huán)鏈表的接口,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • C++的繼承法則詳解

    C++的繼承法則詳解

    本文詳細(xì)介紹了C++中的繼承機(jī)制,包括繼承的概念、定義、使用方法、訪問(wèn)限定符、賦值兼容轉(zhuǎn)換、作用域、默認(rèn)成員函數(shù)、友元關(guān)系、靜態(tài)成員以及單繼承、多繼承和菱形繼承,感興趣的朋友跟隨小編一起看看吧
    2024-11-11
  • C語(yǔ)言中的強(qiáng)符號(hào)和弱符號(hào)介紹

    C語(yǔ)言中的強(qiáng)符號(hào)和弱符號(hào)介紹

    這篇文章主要介紹了C語(yǔ)言中的強(qiáng)符號(hào)和弱符號(hào)介紹,本文用多個(gè)實(shí)例來(lái)講解強(qiáng)符號(hào)和弱符號(hào),需要的朋友可以參考下
    2015-03-03
  • C++?string如何獲取文件路徑文件名、文件路徑、文件后綴(兩種方式)

    C++?string如何獲取文件路徑文件名、文件路徑、文件后綴(兩種方式)

    這篇文章主要介紹了C++?string如何獲取文件路徑文件名、文件路徑、文件后綴(兩種方式),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。
    2023-06-06
  • visualstudio2022工程重命名的圖文步驟

    visualstudio2022工程重命名的圖文步驟

    很多時(shí)候需要用到項(xiàng)目重命名,本文主要介紹了visualstudio2022工程重命名的圖文步驟,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-06-06
  • C++實(shí)現(xiàn)LeetCode(152.求最大子數(shù)組乘積)

    C++實(shí)現(xiàn)LeetCode(152.求最大子數(shù)組乘積)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(152.求最大子數(shù)組乘積),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07

最新評(píng)論

鹤壁市| 拉萨市| 恭城| 石嘴山市| 拜城县| 乌苏市| 陵川县| 凌源市| 缙云县| 南郑县| 仙游县| 辉南县| 美姑县| 广州市| 宣汉县| 瑞昌市| 莆田市| 横峰县| 彭阳县| 界首市| 浮山县| 镇安县| 乌兰县| 陆川县| 东莞市| 镇雄县| 介休市| 筠连县| 东乡族自治县| 大关县| 台东市| 锡林郭勒盟| 美姑县| 烟台市| 赤峰市| 钟山县| 台江县| 鸡泽县| 靖宇县| 乐昌市| 高雄县|