本文主要介绍了利用C++实现输入两个无环的单向链表时,找出它们的第一个公共结点的问题。文章中的示例代码简洁易懂,感兴趣的同学可以和小编一起学习一下
补充
通过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++ 求两个链表的公共结点内容请搜索编程学习网以前的文章希望大家以后多多支持编程学习网!
沃梦达教程
本文标题为:C++ 解决求两个链表的第一个公共结点问题


猜你喜欢
- C语言详解float类型在内存中的存储方式 2023-03-27
- C++ 数据结构超详细讲解顺序表 2023-03-25
- c++ const 成员函数,返回一个 const 指针.但是返回的指针是什么类型的 const? 2022-10-11
- Easyx实现扫雷游戏 2023-02-06
- C语言qsort()函数的使用方法详解 2023-04-26
- Qt计时器使用方法详解 2023-05-30
- ubuntu下C/C++获取剩余内存 2023-09-18
- 我应该为我的项目使用相对包含路径,还是将包含目录放在包含路径上? 2022-10-30
- 详解C语言中sizeof如何在自定义函数中正常工作 2023-04-09
- C语言手把手带你掌握带头双向循环链表 2023-04-03