一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C/C++ - C++ 解決求兩個鏈表的第一個公共結點問題

C++ 解決求兩個鏈表的第一個公共結點問題

2022-03-10 14:36翟天保Steven C/C++

本文主要介紹了利用C++實現輸入兩個無環的單向鏈表時,找出它們的第一個公共結點的問題。文章中的示例代碼簡潔易懂,感興趣的同學可以和小編一起學習一下

題目描述:

輸入兩個無環的單向鏈表,找出它們的第一個公共結點,如果沒有公共節點則返回空。(注意因為傳入數據是鏈表,所以錯誤測試數據的提示是用其他方式顯示的,保證傳入數據是正確的)

數據范圍: n<=1000

要求:空間復雜度 O(1),時間復雜度 O(n)

例如,輸入{1,2,3},{4,5},{6,7}時,兩個無環的單向鏈表的結構如下圖所示:

C++ 解決求兩個鏈表的第一個公共結點問題

可以看到它們的第一個公共結點的結點值為6,所以返回結點值為6的結點。

 

輸入描述:

輸入分為是3段,第一段是第一個鏈表的非公共部分,第二段是第二個鏈表的非公共部分,第三段是第一個鏈表和二個鏈表的公共部分。 后臺會將這3個參數組裝為兩個鏈表,并將這兩個鏈表對應的頭節點傳入到函數FindFirstCommonNode里面,用戶得到的輸入只有pHead1和pHead2。

 

返回值描述:

返回傳入的pHead1和pHead2的第一個公共結點,后臺會打印以該節點為頭節點的鏈表。

 

示例:

輸入:

{1,2,3},{4,5},{6,7}

返回值:

{6,7}

說明:

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

這3個參數最后在后臺會組裝成為2個兩個無環的單鏈表,且是有公共節點的  

 

解題思路:

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

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

 

補充

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

// FindFirstCommandNode.cpp : 定義控制臺應用程序的入口點。
//

#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;//用于指向短鏈表

	//根據長度判斷 鏈表指向
	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;
	}
	//尋找公共節點
	while (pListHeadLong !=NULL && pListHeadShort != NULL && pListHeadLong!= pListHeadShort)
	{
		pListHeadLong  = pListHeadLong->m_pNext;
		pListHeadShort = pListHeadShort->m_pNext;
	}
	//如果不為空  此時的pListHeadLong 與pListNodeShort為同一個節點,返回該節點
	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<<"公共節點的值為:"<<CommNode->m_nKey<<endl;
	}
	else
	{
		cout<<"沒有公共節點"<<endl;
	}
	getchar();
	return 0;
}

到此這篇關于C++ 解決求兩個鏈表的第一個公共結點問題的文章就介紹到這了,更多相關C++ 求兩個鏈表的公共結點內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://blog.csdn.net/zhaitianbao/article/details/121769106

延伸 · 閱讀

精彩推薦
  • C/C++c++ 單線程實現同時監聽多個端口

    c++ 單線程實現同時監聽多個端口

    這篇文章主要介紹了c++ 單線程實現同時監聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

    詳解c語言中的 strcpy和strncpy字符串函數使用

    strcpy 和strcnpy函數是字符串復制函數。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

    本篇文章是對goto語句的替代實現方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網7342020-12-03
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下...

    青山的青6062022-01-04
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經典實例之模擬計算器的相關資料,文中通過示...

    jia150610152021-06-07
主站蜘蛛池模板: 波多野结在线 | 高清视频免费 | 四虎影视884aa·com| 无套暴躁白丝秘书 | 欧美透逼视频 | 4虎影院永久地址www | 精品国产自在现线久久 | 欧美免赞性视频 | 天天快乐在线观看 | 人人揉人人爽五月天视频 | 美女张开腿让男人桶的 视频 | 成人免费淫片95视频观看网站 | 国产精品igao视频网网址 | 无人影院免费观看 | 午夜AV国产欧美亚洲高清在线 | 国产成+人+综合+亚洲不卡 | 2019天天干天天操 | 国产精品一区牛牛影视 | 免费特黄一级欧美大片 | 538精品视频 | 青涩体验在线观看未删减 | 青青青青在线视频 | 国产一区二区三区在线观看视频 | 国产精品福利在线观看入口 | 单亲乱l仑在线观看免费观看 | 色综合中文字幕在线亚洲 | 91成人啪国产啪永久地址 | 国语精彩对白2021 | 视频在线免费看 | 欧美三级小视频 | 亚洲AV蜜桃永久无码精品无码网 | 久久视热频国产这里只有精品23 | 日韩欧美中文字幕一区二区三区 | 天仙tv微福视频 | bbox撕裂bass孕妇 | 欧美黄站 | 亚洲成人三级 | 91国产在线播放 | 日本不卡在线视频高清免费 | 亚洲一区二区三区久久精品 | 久久精品国产在热亚洲 |