链表相交以及找循环链表入口

链表相交需要判断有无循环,无循环直接找最后一个节点进行比较,有循环找某个循环点然后看看另一条是否也有这个点。

找循环链表入口比较牛逼:
在p2和p1第一次相遇的时候,假定p1走了n步,环路的入口是在h步的时候经过的,那么有
  p1走的路径: h+c = n;         c为p1和p2相交点,距离环路入口的距离
  p2走的路径: h+c+k*r = 2*n;    r为环路的周长,k是整数
显然,如果从h+c点开始,p1再走n步骤的话,还可以回到h+c这个点
同时p2从头开始走的话,经过n步,也会达到h+c这点
显然在这个步骤当中p1和p2只有前h步走的路径不同,所以当p1和p2再次重合的时候,必然是在链表的环路入口点上。

时间: 2024-10-11 15:07:12

链表相交以及找循环链表入口的相关文章

数据结构和算法设计专题之---推断两个链表是否相交并找出交点

题目: 一个比較经典的问题,推断两个链表是否相交.假设相交找出他们的交点. 首先来看一下怎样推断两个链表是否存在相交的节点: 思路: 1.碰到这个问题,第一印象是採用hash来推断,将两个链表的节点进行hash.然后推断出节点,这样的想法当然是能够的. 2.当然採用暴力的方法也是能够的,遍历两个链表.在遍历的过程中进行比較,看节点是否同样. 3.第三种思路是比較奇特的,在编程之美上看到的. 先遍历第一个链表到他的尾部,然后将尾部的next指针指向第二个链表(尾部指针的next本来指向的是null

数据结构和算法设计专题之---判断两个链表是否相交并找出交点

题目: 一个比较经典的问题,判断两个链表是否相交,如果相交找出他们的交点. 首先来看一下如何判断两个链表是否存在相交的节点: 思路: 1.碰到这个问题,第一印象是采用hash来判断,将两个链表的节点进行hash,然后判断出节点,这种想法当然是可以的. 2.当然采用暴力的方法也是可以的,遍历两个链表,在遍历的过程中进行比较,看节点是否相同. 3.第三种思路是比较奇特的,在编程之美上看到的.先遍历第一个链表到他的尾部,然后将尾部的next指针指向第二个链表(尾部指针的next本来指向的是null).

使用OC实现单链表:创建、删除、插入、查询、遍历、反转、合并、判断相交、求成环入口

一.概念 链表和数组都是一种线性结构,数组有序存储的,链表是无序存储的. 数组中的每一个元素地址是递增或者递减的关系,链表的每一个节点的地址没有此规律,它们是通过指针的指向连接起来. 链表种类:单链表.双向链表.循环链表.双向循环链表 单链表:一个数据域data.一个后继指针域next.也即:上一个节点指向下一个节点,尾节点指向空. 双向链表:一个数据域data.一个前驱指针域previous.一个后继指针域next.也即:上一个节点和下一个节点互相指向,尾节点指向空. 循环链表:一个数据域da

C语言强化(七)链表相交问题_5 找到两个有环链表的相交结点

有环链表是否相交我们也可以判断了,剩下的就是获得有环链表相交结点 题目 给出俩个单向链表的头指针,比如 h1,h2,判断这俩个链表是否相交 解题步骤 判断两个[无环]链表是否相交 找到两个[无环]链表的相交结点 判断链表是否带环 判断两个[有环]链表是否相交 找到两个[有环]链表的相交结点 思路: 显然,有环链表的相交点其实就是环的入口 如图 所以 问题转为求环的入口 直接上理论,具体解释不难,纯粹是一道小学数学追赶问题 若在头结点和快慢指针相遇结点分别设一指针,同步(单步)前进,则最后一定相遇

如何判断两个链表相交及找到第一个相交点

参考原文地址:https://www.cnblogs.com/BeyondAnyTime/archive/2012/07/06/2580026.html 1.问题分析 看看两个链表相交到底是怎么回事吧,有这样的的几个事实:(假设链表中不存在环) (1)一旦两个链表相交,那么两个链表中的节点一定有相同地址. (2)一旦两个链表相交,那么两个链表从相交节点开始到尾节点一定都是相同的节点. 分析出来了问题的本质,那么思路也就自然有了. 2.问题解法 2.1 哈希解法: 既然连个链表一旦相交,相交节点一

两个链表相交以及第一个公共节点的问题

判读两个链表是否相交以及如果相交它们的第一个公共节点的问题,主要分这么几种情况: 1)两个链表均不含有环 2)两个链表均含有环 对于一个有环一个没有,那么它们即不相交也没有公共节点 首先定义节点的结构 struct Node { int value; Node *next; }; 判断链表是否有环函数 bool isRingList(Node *head) { if(NULL == head) return false; Node *p1 = head, *p2 = p1->next; whil

C语言强化(七)链表相交问题_4 判断两个有环链表是否相交

上一节结束后,我们已经可以判断链表是否有环了,如果无环,那么按照前两节所讲的方法去判断链表是否相交以及获取相交结点,如果有环呢?怎么判断是否相交? 题目 给出俩个单向链表的头指针,比如 h1,h2,判断这俩个链表是否相交 解题步骤 判断两个[无环]链表是否相交 找到两个[无环]链表的相交结点 判断链表是否带环 判断两个[有环]链表是否相交 找到两个[有环]链表的相交结点 思路 对于有环的链表,只要它们相交,则带环的那一段必定完全重复.所以我们只需要在链表一上找到环上的一个结点,判断该结点是否在链

Python与数据结构[0] -> 链表[2] -> 链表有环与链表相交判断的 Python 实现

链表有环与链表相交判断的 Python 实现 目录 有环链表 相交链表 1 有环链表 判断链表是否有环可以参考链接, 有环链表主要包括以下几个问题(C语言描述): 判断环是否存在: 可以使用追赶方法,定义两个指针slow和fast,分别以1步和2步前进,若存在环则两者会相遇,否则fast遇到NULL时则退出: 获取环的长度:若存在环,则以相遇点为起点,fast和slow再次开始前进,第二次碰相遇slow走过的步数(1圈)即为环长度: 找出入环点:相遇点到连接点的距离 = 头指针到连接点的距离,因

如何判断链表相交

链表相交:对于链表而言,两个链表如果相交就会合并成一个后继,之后后继成为一个链表.根据相交的理论可以建立出两个简单的链表相交. 当用户在第一个链表中输入10的那个点作为要相交的那个点,第二个链表输入零之后就与第一个链表的10那个点相交. 代码如下: 1 #include <stdio.h> 2 typedef struct Linklist{ 3 int num; 4 struct Linklist *next; 5 }list; 6 7 struct Linklist *in; 8 9 vo