算法中常常会推断两条单链表是否相交,尽管算法简单,但也值得说一下。

代码中有详尽凝视。 Show you the code !

#undef UNICODE#include <iostream>
#include <Windows.h>
#include <cstring>using namespace std;typedef struct _SINGLE_LIST {_SINGLE_LIST *Next;char Tag;
} SINGLE_LIST, *PSINGLE_LIST;void main()
{PSINGLE_LIST Entry = NULL;char TagIndex = 'A';PSINGLE_LIST Head1 = (PSINGLE_LIST)malloc(sizeof(SINGLE_LIST));Entry = Head1;Entry->Tag = TagIndex++;Entry->Next = NULL;for (int i = 0; i < 6; i++) {Entry->Next = (PSINGLE_LIST)malloc(sizeof(SINGLE_LIST));Entry->Next->Tag = TagIndex++;Entry->Next->Next = NULL;Entry = Entry->Next;}PSINGLE_LIST Head2 = (PSINGLE_LIST)malloc(sizeof(SINGLE_LIST));Entry = Head2;Entry->Tag = TagIndex++;Entry->Next = NULL;for (int i = 0; i < 3; i++) {Entry->Next = (PSINGLE_LIST)malloc(sizeof(SINGLE_LIST));Entry->Next->Tag = TagIndex++;Entry->Next->Next = NULL;Entry = Entry->Next;}// 构造一个交点Entry->Next = Head1->Next->Next->Next;// 下图即为此时两个链表的连接情况// +--------------------------------------------+// |   A -> B -> C -> D -> E -> F -> G          |// |                  ^                         |// |                  |                         |// |   H -> I -> J -> K                         |// +--------------------------------------------+// 方法一: // 循环遍历第一个链表中的每一项,查看是否在第二个链表中。由于两个单链表相交// 遍历当中任一链表,至少一个或多个项在第二个链表中。在最坏的情况下,将运算// m*n 次。 算法例如以下:BOOL IsIntersect = FALSE;PSINGLE_LIST IntersectEntry = NULL;Entry = Head1;while (Entry != NULL) {PSINGLE_LIST Entry2 = Head2;while (Entry2) {if (Entry == Entry2) {IsIntersect = TRUE;IntersectEntry = Entry;goto Result;}Entry2 = Entry2->Next;}Entry = Entry->Next;}Result:if (IsIntersect) {//cout << "Intersect: " << "True.   " << "Tag - " << IntersectEntry->Tag  << endl;cout << "Intersect: " << "True." << endl;} else {cout << "Intersect: " << "False" << endl;}// 方法二: // 观察上图不难发现假设两个单链表相交,那么最后一个项必定同样。所以假设站在仅仅推断单// 链表是否相交的角度来看。算法事实上能够更简单。

两个链表各遍历一遍,找到最后一个项, // 检查是否同样。运算次数为 m+n。 算法例如以下: PSINGLE_LIST LastEntry1 = NULL; PSINGLE_LIST LastEntry2 = NULL; Entry = Head1; while (Entry != NULL) { Entry = Entry->Next; } LastEntry1 = Entry; Entry = Head2; while (Entry != NULL) { Entry = Entry->Next; } LastEntry2 = Entry; if (LastEntry1 == LastEntry2) { IsIntersect = TRUE; } if (IsIntersect) { //cout << "Intersect: " << "True. " << "Tag - " << IntersectEntry->Tag << endl; cout << "Intersect: " << "True." << endl; } else { cout << "Intersect: " << "False" << endl; } }

这就是编程之美。同样的问题採用不同的方法,效果全然不同。

转载于:https://www.cnblogs.com/gavanwanggw/p/6781102.html

推断两条单链表是否相交相关推荐

  1. 7_2判断两个单链表是否相交,若相交,求出第一个交点

    转载请注明出处:http://www.cnblogs.com/wuzetiandaren/p/4251372.html 声明:现大部分文章为寻找问题时在网上相互转载,此博是为自己做个记录记录,方便自己 ...

  2. 判断两个单链表是否相交及找到第一个交点

    题目:给两个单链表,如何判断两个单链表是否相交?若相交,则找出第一个相交的节点.  这道题的思路和解法有很多,在这把这道题的解法做一个详细的总结. 解这道题之前,我们需要首先明确一个概念:  如果两个 ...

  3. java 判断两个单链表是否相交

    文章目录 题目 思考 源码 环的入口 题目 单链表可能有环,也可能无环.给定两个单链表的头节点 head1 和 head2, 这两个链表可能相交,也可能不相交.请实现一个函数,如果两个链表相交,请返回 ...

  4. 判断两个单链表是否相交--java实现

    题目描述:单链表可能有环,也可能无环.给定两个单链表的头节点 head1 和 head2, 这两个链表可能相交,也可能不相交.请实现一个函数,如果两个链表相交,请返回相交 的第一个节点;如果不相交,返 ...

  5. 单链表——判断两个单链表(无头节点)是否相交,如果相交,返回单链表的第一个结点

    本博客主要记录两个解法: 1.求两个单链表的节点个数,消除结点个数不同带来的影响,两个指针一起走,相遇即相交点. 2.数学方式求解. 一.求结点个数,消除结点个数不同带来的影响,俩指针同步走 思路:两 ...

  6. 有苦有乐的算法 --- 可能有环也可能无环的两个单链表,判断这两个链表是否相交,如果相交返回相交的第一个节点

    题目 可能有环也可能无环的两个单链表,判断这两个链表是否相交,如果相交返回相交的第一个节点. 解析 第一步,判断链表是有环链表还是无环链表: 如果一个单链表无环,它一定有一个指向null的尾结点: 如 ...

  7. 左神算法:两个单链表相交的一系列问题(链表是否有环 / 两无环链表是否相交 / 两有环链表是否相交)

    本题来自左神<程序员代码面试指南>"两个单链表相交的一系列问题"题目. 题目 在本题中,单链表可能有环,也可能无环.给定两个单链表的头节点 head1 和 head2, ...

  8. c++如何判断两个字符串是否相同?_链表 | 如何判断两个单链表(无环)是否交叉...

    如何判断两个单链表(无环)是否交叉 单链表相交指的是两个链表存在完全重合的部分,如下图所示 在上图中,这两个链表相交于结点5,要求判断两个链表是否相交,如果相交,找出相交处的结点. 分析 Hash法 ...

  9. 将两个单链表合并为一个单链表

    将两个单链表合并为一个单链表(C语言实现) 目的:掌握单链表的应用和算法设计 内容:L1 =(x1, x2, -, xn ),L2 =(y1, y2, -, ym ),他们是两个线性表,采用带头结点的 ...

最新文章

  1. 分析各种排序算法的优劣
  2. 集合的交集和函数的例题
  3. load data详解
  4. leetcode 662. Maximum Width of Binary Tree | 662. 二叉树最大宽度(BFS)
  5. SAP ABAP RFC table administration
  6. SQL Server聚集索引的选择
  7. conda安装特定版本的包
  8. “成长”必经之路:越努力越幸运
  9. Qt 2D绘图之一:基本图形绘制和渐变填充
  10. 云南昭通暴雨强度公式_玉溪市中心城区暴雨强度公式(修订)
  11. 苹果鼠标右键怎么按_UG经验技巧案例17把UG命令设置到Shift+Ctrl+鼠标的左、中、右三键及右键长、按右键的方法...
  12. MOOC下载器的文档整理
  13. 数据库实体、关系(一对一实现方式、一对多实现方式、多对多实现方式)
  14. golang json解析
  15. GhostNet网络详解
  16. 每日影视大全隐私政策
  17. 用代码写一个炫酷的地球
  18. 计算机桌面字大怎么变小,电脑桌面图标文字大怎么变小
  19. Winds Liunx Docker 安装Redis
  20. match2(双周赛)

热门文章

  1. 下载的TXT小说如何去除广告、去除多余空行?
  2. 视频中的运动特征--Learning Motion Patterns in Videos
  3. LeetCode 215. Kth Largest Element in an Array--数字第K大的元素--最大堆或优先队列--C++,Python解法
  4. 最小二乘法预测c语言,用最小二乘法推导本吧会员增长方程,以预测人数增长情况...
  5. java 摘要算法_Java实现消息摘要算法加密
  6. mysql如何防止插入重复数据_防止MySQL重复插入数据的三种方法
  7. zookeeper同一台服务器创建伪集群
  8. SpringBoot监听redis过期key
  9. 专转本计算机应用基础,江苏省专转本计算机应用基础模拟题
  10. oracle字符串提取函数,oracle字符串分割和提取函数定义