上周面试挂了,反思原因,莫非是因为一道算法题没做好吗?这题目是“判断两条链表是否交叉,若有交叉,返回交叉节点的指针。” 为了防止反复在同一个阴沟里翻船,决定把最优解写出来。

#include "pch.h"
#include <iostream>
#include<assert.h>template<typename T>
class List {
public:struct Node {T data;Node* next = nullptr;Node(T& d) : data(d) {}};Node* m_head = nullptr;
private:enum {E_SUCCESS = 0,E_FAIL = -1};
public://List(){}~List() {Node* pcur = m_head, *pnext = nullptr;while (pcur) {pnext = pcur->next;delete pcur;pcur = pnext;}}int AddNode(T dt, bool at_tail = true) {Node*ptr = new Node(dt);return AddNode(ptr, at_tail);}int AddNode(Node* nd, bool at_tail = true) {if (nd) {if (at_tail) {Node* ptail = Tail();if (ptail) {ptail->next = nd;}else {m_head = nd;}}else {nd->next = m_head;m_head = nd;}return E_SUCCESS;}return E_FAIL;}Node* Intersect(List& oth) {Node* entrance1 = LoopEntrance();Node* entrance2 = oth.LoopEntrance();if (entrance1 == entrance2) {return entrance1;}else if (!entrance1 && !entrance2) {Node* longlist_ptr = nullptr, *shortlist_ptr = nullptr;{const int sz1 = Size();const int sz2 = oth.Size();int num = 0;if (sz1 >= sz2) {longlist_ptr = m_head;shortlist_ptr = oth.m_head;num = sz1 - sz2;}else {longlist_ptr = oth.m_head;shortlist_ptr = m_head;num = sz2 - sz1;}for (int i = 0; i < num; ++i) {if (longlist_ptr) {longlist_ptr = longlist_ptr->next;}}}while (longlist_ptr && shortlist_ptr) {if (longlist_ptr == shortlist_ptr) {return longlist_ptr;}longlist_ptr = longlist_ptr->next;shortlist_ptr = shortlist_ptr->next;}}return nullptr;}Node* LoopEntrance() {Node *fast_ptr = m_head, *slow_ptr = m_head;bool has_loop = false;while (fast_ptr && fast_ptr->next) {fast_ptr = fast_ptr->next->next;slow_ptr = slow_ptr->next;if (fast_ptr == slow_ptr) {has_loop = true;break;}}if (has_loop) {slow_ptr = m_head;while (1 /*fast_ptr && fast_ptr->next && slow_ptr*/) {if (fast_ptr == slow_ptr) {return fast_ptr;}fast_ptr = fast_ptr->next;slow_ptr = slow_ptr->next;}}return nullptr;}private:Node* Tail() {if (LoopEntrance()) {return nullptr;}Node* ptr = m_head;while (ptr && ptr->next) {ptr = ptr->next;}return ptr;}int Size() {int sz = 0;Node* ptr = m_head;Node* entrance = LoopEntrance();if (entrance) {while (ptr && ptr != entrance) {sz++;ptr = ptr->next;}assert(ptr == entrance);sz++; // entrance pointwhile (ptr && ptr->next != entrance) {sz++;ptr = ptr->next;}}else {while (ptr) {sz++;ptr = ptr->next;}}return sz;}
};int main()
{std::cout << "Hello World!\n"; List<int> list1, list2;for (int i = 1; i < 3; ++i) {list1.AddNode(i);}for (int i = 25; i < 28; ++i) {list2.AddNode(i);}#if 1for (int i = 100; i < 101; ++i) {List<int>::Node* node = new List<int>::Node(i);list1.AddNode(node);list2.AddNode(node);}
#endifauto ptr = list1.Intersect(list2);if (ptr) {std::cout << "intersect point at " << ptr << std::endl;}else {std::cout << "no intersect\n";}return 0;
}

代码创建了两条有交叉节点的链表。如图所示:

程序运行结束时,析构这两条链表,发生错误,是因为交叉节点被两次释放:

转载于:https://blog.51cto.com/frankniefaquan/2378379

判断两条链表是否交叉,若有交叉,返回交叉节点的指针。相关推荐

  1. 如何判断两个链表是否相交并求出相交点

    排除链表存在环的情况 此情况的意思就是普通的单链表是否相交问题. 相交是什么意思?注意不是单纯的节点的数值域相等,相交的意思是两个链表的部门节点的是同一个,就是这些节点为这两个链表共有. 链表的定义参 ...

  2. 编程之美:编程判断两个链表是否相交

    1.问题描述 给出两个单向链表的头指针,比如h1.h2,判断两个链表是否相交.编程之美为了简化问题,假设两个链表均不带环. 如下图: 2.分析与解法 解法一:直观法,先判断第一个链表的每个节点是否在第 ...

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

    判断两个链表是否相交,若相交则求其交点(指第一个相交的点). 思路1,利用计数法: 遍历链表1,将其节点的内存地址存入map或者hashmap内.然后遍历链表2,并查询map或者hashmap,判断链 ...

  4. 判断两个链表是否相交

    方法:获得两个链表的长度,获得长度的差值len,然后首先遍历较长的链表len次,然后再同时遍历两个链表,如果有相同部分,两个链表就相交,如果没有,则不相交,即没有公共部分. 代码: #include ...

  5. POJ1269:Intersecting Lines(判断两条直线的关系)

    题目:POJ1269 题意:给你两条直线的坐标,判断两条直线是否共线.平行.相交,若相交,求出交点. 思路:直线相交判断.如果相交求交点. 首先先判断是否共线,之后判断是否平行,如果都不是就直接求交点 ...

  6. ]数据结构:单链表之判断两个链表是否相交及求交点(带环、不带环)

    1.判断两个链表是否相交,若相交,求交点.(假设链表不带环) 两个指针同时指向两个链表,分别依次往后遍历链表到最后一个节点,如指针的值相同(即节点地址相同),反之没有交点. int IsCross(N ...

  7. 如何判断链表有环、如何判断两个链表相交

    如何判断单链表是否存在环 有一个单向链表,链表当中有可能出现"环",就像题图这样.如何用程序判断出这个链表是有环链表? 不允许修改链表结构. 时间复杂度O(n),空间复杂度O(1) ...

  8. 如何判断两条直线是否相交

    之前写过一篇如何判断两条线段是否相交,我们紧接这个主题,再来谈谈如何判断两条直线是否相交 如何判断两条直线是否相交 总体来上,判断直线是否相交比判断线段是否相交容易多了 两条直线相交只有两种情况 第一 ...

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

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

最新文章

  1. Dell XP版本在非Dell机子上的激活问题
  2. openfire消息通知推送_APP消息推送功能之前端后台设计
  3. selenium和python的关系,Selenium+python
  4. c中获取python控制台输出_linux c程序中获取shell脚本输出的实现方法
  5. javascript内存泄漏调试工具mac_Vuex3.1.1更新:支持jsDelivr,修复内存泄漏
  6. 【Paddle】实践作业——建立模型并测试100张图片
  7. 《大型数据库技术》MySQL数据库安装配置及基础使用
  8. UVa 400 (水题) Unix ls
  9. React-flux杂记
  10. win10虚拟打印服务器,win10虚拟打印机驱动怎么安装_win10系统安装虚拟打印机驱动教程...
  11. 显示计算机无法检测到扫描仪,为何我的电脑检测不到我的扫描仪?
  12. 20日均线操作系统法
  13. Python 替换同义词(jieba 实现)
  14. Go语言之error
  15. 【机器学习-白板推导系列】学习笔记---支持向量机和主成分分析法
  16. 太强了,用Python+Excel制作天气预报表!
  17. va_list(),va_start()
  18. android Button美化
  19. linux基础培训下载,huimaiLinux系统基础培训.ppt
  20. MP3中歌词怎么弄?

热门文章

  1. Linux 网页挂马实验,网页挂马详细教程
  2. echarts瀑布图_ECharts · Example
  3. ubuntu20.1 查看apt仓库_上海食品冷藏仓库出租查看
  4. 计算机二级mysql报名2020_关于2020年秋季全国计算机等级考试报名的通知
  5. 【纪中集训2019.3.26】动态半平面交
  6. java mysql 数据库
  7. mysql分区功能详细介绍,以及实例
  8. 用字节流查看txt文件
  9. 对于牛老师作业陈老师作业补充(老陈、小石头的典型用户、用例图、场景)...
  10. T级图片数据Cache思路以及图片服务器搭建方法