欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++?解決求兩個鏈表的第一個公共結(jié)點問題

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

題目描述:

輸入兩個無環(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,2,3},{4,5},{6,7}

返回值:

{6,7}

說明:

第一個參數(shù){1,2,3}代表是第一個鏈表非公共部分,第二個參數(shù){4,5}代表是第二個鏈表非公共部分,最后的{6,7}表示的是2個鏈表的公共部分

這3個參數(shù)最后在后臺會組裝成為2個兩個無環(huán)的單鏈表,且是有公共節(jié)點的??

解題思路:

本題考察數(shù)據(jù)結(jié)構(gòu)鏈表的使用。將兩個鏈表指針向前步進,走到頭后就錯位繼續(xù)前進,因為兩個指針行進的速度一致,走著走著就撞一起了,如下方gif動畫所示,很直觀。

測試代碼:

/*
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;
    }
};

補充

通過C++找出兩個鏈表的所有公共結(jié)點:

// FindFirstCommandNode.cpp : 定義控制臺應(yīng)用程序的入口點。
//
 
#include "stdafx.h"
#include <iostream>
using namespace std;
 
struct ListNode
{
	int         m_nKey;
	ListNode*   m_pNext;
 
	ListNode(int i):m_nKey(i)
	{
 
	}
};
 
//獲取鏈表長度
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;//兩個鏈表的長度差
	ListNode* pListHeadLong  = NULL;//用于指向長鏈表
	ListNode* pListHeadShort = NULL;//用于指向短鏈表
 
	//根據(jù)長度判斷 鏈表指向
	if (nLength1 > nLength2)
	{
	    nLengthDif = nLength1 - nLength2;
		pListHeadShort = pHead2;
		pListHeadLong  = pHead1;
	}
	else
	{
		nLengthDif = nLength2 - nLength1;
		pListHeadLong  = pHead2;
		pListHeadShort = pHead1;
	}
 
	//先對長鏈表進行移動 移動到與短鏈表長度相同的位置
	for (int i = 0; i < nLengthDif; i++)
	{
		pListHeadLong = pListHeadLong->m_pNext;
	}
	//尋找公共節(jié)點
	while (pListHeadLong !=NULL && pListHeadShort != NULL && pListHeadLong!= pListHeadShort)
	{
		pListHeadLong  = pListHeadLong->m_pNext;
		pListHeadShort = pListHeadShort->m_pNext;
	}
	//如果不為空  此時的pListHeadLong 與pListNodeShort為同一個節(jié)點,返回該節(jié)點
	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的長度為:"<<GetListLength(head1)<<endl;
	cout<<"鏈表2的長度為:"<<GetListLength(head2)<<endl;
 
 
	ListNode* CommNode = FindFirstCommandNode(head1,head2);
	if (CommNode!= NULL)
	{
		cout<<"公共節(jié)點的值為:"<<CommNode->m_nKey<<endl;
	}
	else
	{
		cout<<"沒有公共節(jié)點"<<endl;
	}
	getchar();
	return 0;
}

到此這篇關(guān)于C++ 解決求兩個鏈表的第一個公共結(jié)點問題的文章就介紹到這了,更多相關(guān)C++ 求兩個鏈表的公共結(jié)點內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++標準模板庫STL深入講解

    C++標準模板庫STL深入講解

    STL提供了一組表示容器、迭代器、函數(shù)對象和算法的模板。容器是一個與數(shù)組類似的單元,可以存儲若干個值。STL容器是同質(zhì)的,即存儲的值的類型相同:算法是完成特定任務(wù)(如對數(shù)組進行排序或在鏈表中查找特定值)的處方
    2022-12-12
  • VC基于ADO技術(shù)訪問數(shù)據(jù)庫的方法

    VC基于ADO技術(shù)訪問數(shù)據(jù)庫的方法

    這篇文章主要介紹了VC基于ADO技術(shù)訪問數(shù)據(jù)庫的方法,較為詳細的分析了VC使用ADO操作數(shù)據(jù)庫的相關(guān)實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-10-10
  • c++中的兩種getline用法詳解

    c++中的兩種getline用法詳解

    c++中有2種getline函數(shù),一種在頭文件 <istream> 中,是istream類的成員函數(shù);另一種是在頭文件 <string> 中,是普通函數(shù)。這篇文章主要介紹了c++中的兩種getline用法,需要的朋友可以參考下
    2020-02-02
  • C語言 詳細解析時間復(fù)雜度與空間復(fù)雜度

    C語言 詳細解析時間復(fù)雜度與空間復(fù)雜度

    算法復(fù)雜度分為時間復(fù)雜度和空間復(fù)雜度。其作用: 時間復(fù)雜度是度量算法執(zhí)行的時間長短;而空間復(fù)雜度是度量算法所需存儲空間的大小
    2022-04-04
  • 圖的鄰接表存儲表示示例講解

    圖的鄰接表存儲表示示例講解

    這篇文章主要介紹了圖的鄰接表存儲表示,大家參考使用
    2013-11-11
  • Qt5中QML自定義環(huán)形菜單/環(huán)形選擇框的實現(xiàn)

    Qt5中QML自定義環(huán)形菜單/環(huán)形選擇框的實現(xiàn)

    本文主要介紹了Qt5中QML自定義環(huán)形菜單/環(huán)形選擇框的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C語言順序表實現(xiàn)代碼排錯

    C語言順序表實現(xiàn)代碼排錯

    這篇文章主要介紹了C語言順序表實現(xiàn)方法,大家參考使用吧
    2013-12-12
  • 深入淺析c/c++ 中的static關(guān)鍵字

    深入淺析c/c++ 中的static關(guān)鍵字

    C++的static有兩種用法:面向過程程序設(shè)計中的static和面向?qū)ο蟪绦蛟O(shè)計中的static。本文重點給大家介紹c/c++ 中的static關(guān)鍵字,感興趣的朋友跟隨小編一起看看吧
    2018-08-08
  • C語言實現(xiàn)求梅森素數(shù)的代碼與解析

    C語言實現(xiàn)求梅森素數(shù)的代碼與解析

    這篇文章主要給大家介紹了關(guān)于利用C語言實現(xiàn)求梅森素數(shù)的代碼與解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-12-12
  • 詳解C語言中的錯誤報告errno與其相關(guān)應(yīng)用方法

    詳解C語言中的錯誤報告errno與其相關(guān)應(yīng)用方法

    這篇文章主要介紹了C語言中的錯誤報告errno與其相關(guān)應(yīng)用方法,包括errno和strerror以及perror的介紹,需要的朋友可以參考下
    2015-08-08

最新評論