C++判断两个链表是否相交算法
1.判断一个链表是否相交,若相交,求交点(假设链表带环)
2.具体思路如下图所示
既然已经分析清楚,那么代码就很好实现了.
Node* IsHaveCrossNode(Node* head1,Node* head2){assert(head1);assert(head2);Node* meetNode1 = IsCircle(head1);Node* meetNode2 = IsCircle(head2);//排除第1种情况if (meetNode1 == NULL || meetNode2 == NULL){return NULL;}//说明两个链表都带环//根据相遇点排除第2种情况Node* cur1 = meetNode1->_next;while (cur1 != meetNode1 && cur1 != meetNode2){cur1 = cur1->_next;}if (cur1 != meetNode2){return NULL;}//区分第3和第4种情况(需要求出两个入口点)Node* entry1 = GetEntryNode(head1, meetNode1);Node* entry2 = GetEntryNode(head2, meetNode2);//第3种情况(转化为求两个链表的交点,链表不带环时)if (entry1 == entry2){entry1->_next = NULL;entry2->_next = NULL;Node* meet = IsMeet(head1, head2);return meet;}//第4种情况(有两个入口点,返回一个即可)return entry1;}
内部调用的函数如下:
//判断一个链表是否带环//思路:快慢指针,返回相遇点Node* IsCircle(Node* head){if (head == NULL){return NULL;}Node* pFast = head;Node* pSlow = head;//快指针一次走两步,慢指针一次走一步while (pFast && pFast->_next){pFast = pFast->_next->_next;pSlow = pSlow->_next;if (pFast == pSlow){break;}}if (pFast && pFast->_next){return pFast;}return NULL;}Node* GetEntryNode(Node* head, Node* meetNode){assert(head && meetNode);Node* p1 = head;Node* p2 = meetNode;while (p1 != p2){p1 = p1->_next;p2 = p2->_next;}return p1;}//判断是否相交,判断尾节点//若相交,则返回交点Node* IsMeet(Node* head1,Node* head2){assert(head1 && head2);Node* cur1 = head1;int count1 = 0;Node* cur2 = head2;int count2 = 0;while (cur1->_next){++count1;cur1 = cur1->_next;}while (cur2->_next){count2++;cur2 = cur2->_next;}if (cur1 != cur2){return NULL;//说明没有交点}int D_val = count2 - count1;if (D_val < 0){D_val = -D_val;}//cur1 = head1;cur2 = head2;if (count1 < count2){//让head2链表先走D_val长度while (cur2 && D_val--){cur2 = cur2->_next;}while (cur2 && cur1 != cur2){cur1 = cur1->_next;cur2 = cur2->_next;}if (cur1 == cur2){return cur1;}}else{//让head1链表先走D_val长度while (cur1 && D_val--){cur1 = cur1->_next;}while (cur1 && cur1 != cur2){cur1 = cur1->_next;cur2 = cur2->_next;}if (cur1 == cur2){return cur1;}}return NULL;}
C++判断两个链表是否相交算法相关推荐
- 编程之美:编程判断两个链表是否相交
1.问题描述 给出两个单向链表的头指针,比如h1.h2,判断两个链表是否相交.编程之美为了简化问题,假设两个链表均不带环. 如下图: 2.分析与解法 解法一:直观法,先判断第一个链表的每个节点是否在第 ...
- 3.6 判断两个链表是否相交
判断两个链表是否相交,若相交则求其交点(指第一个相交的点). 思路1,利用计数法: 遍历链表1,将其节点的内存地址存入map或者hashmap内.然后遍历链表2,并查询map或者hashmap,判断链 ...
- 判断两个链表是否相交
方法:获得两个链表的长度,获得长度的差值len,然后首先遍历较长的链表len次,然后再同时遍历两个链表,如果有相同部分,两个链表就相交,如果没有,则不相交,即没有公共部分. 代码: #include ...
- ]数据结构:单链表之判断两个链表是否相交及求交点(带环、不带环)
1.判断两个链表是否相交,若相交,求交点.(假设链表不带环) 两个指针同时指向两个链表,分别依次往后遍历链表到最后一个节点,如指针的值相同(即节点地址相同),反之没有交点. int IsCross(N ...
- 判断单链表是否存在环,判断两个链表是否相交问题详解(转)
转自:http://www.cppblog.com/humanchao/archive/2008/04/17/47357.html 有一个单链表,其中可能有一个环,也就是某个节点的next指向的是链表 ...
- 如何判断两个链表是否相交并求出相交点
排除链表存在环的情况 此情况的意思就是普通的单链表是否相交问题. 相交是什么意思?注意不是单纯的节点的数值域相等,相交的意思是两个链表的部门节点的是同一个,就是这些节点为这两个链表共有. 链表的定义参 ...
- 判断两个链表是否相交,若相交,求交点。(假设链表可能带环)【升级版】(C语言)
int IsListCroseWithCycle(PSListNode pL1, PSListNode pL2) {PSListNode pMeetNode1 = HasCycle(pL1);PSLi ...
- 编程之美-判断两个链表是否相交方法整理
[试题描述] 记 N = length(h1) M = length(h2) 方法一:暴力搜索,时间复杂度为O(N*M) 方法二:时间复杂度为O(N+M) 方法三: 方法四:时间复杂度为O(N+M) ...
- 判断单链表是否存在环以及两个链表是否相交
有一个单链表,其中可能有一个环,也就是某个节点的next指向的是链表中在它之前的节点,这样在链表的尾部形成一环.如下图: 图1 有环的链表 问题:如何判断一个链表是不是这类链表?如果链表为存在环,如何 ...
最新文章
- CUDA下在Host端分配的几种内存模式
- 第一章:渗透测试之信息搜集
- 译注(3): NULL-计算机科学上最糟糕的失误
- IBM希望其“裁剪”过的Swift能够引诱你使用BlueMix云
- linux-查看文件类型-看本质-file
- tensorboard 1.14.0 has requirement setuptools>=41.0.0, but you‘ll have setuptools 40.2.0
- JavaScript判断数组是否有重复值
- 手把手教你从0-1做一张酷炫驾驶舱,让老板对你赞不绝口
- 去掉CSDN blog 多余的版权申明部分[转贴]
- 什么是句柄,句柄有什么作用
- android中图标怎么改,android的软件图标怎么改
- 怎样给图片降噪?这几个图片降噪软件可以帮助你
- ARMv7和ARMv8架构比较
- module github.com/jinzhu/gorm/dialects/mysql: git ls-remote -q origin in E:\go_gin\pkg\mod\cache\vcs
- 用于冗余音频数据的RTP负载格式(RFC2198)
- matlab中的addemup是什么,毕业论文-rsa密码体制的设计及matlab语言下的实现
- frp-内网穿透-远程桌面
- 10月2号陪同学买笔记本的经历
- 【第21天】SQL进阶-查询优化- performance_schema系列三:事件记录(SQL 小虚竹)
- Handler.obtainMessage()的认识和理解