面试题56. 链表中环的入口结点

2024-05-14 16:48

本文主要是介绍面试题56. 链表中环的入口结点,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目描述
一个链表中包含环,请找出该链表的环的入口结点。比如下面的链表,包含一个从3到5的环,3为这个环的入口节点,写个程序找到节点3。

这里写图片描述

思路:
本题可用快慢指针的思想
设置两个指针p和q。p每次向前走一步,q每次向前走两步,即:p = p.next;q = q.next.next。
可以说p的速度是v,q的速度是2v。
因为q跑的快,所以会在某处追上p,这个位置记为:“meet处”(就是一个名字)。
设从起点到环入口处的长度为L1, 环的长度为L2, 环入口处到meet处的长度为L3(L3 <= L2)

接着做如下分析(可直接跳过看结论)

算法分析:

这里写图片描述

从上面的分析可知 L1 = L2 - L3。
设置两个指针a,b,让a从起点处出发,b从“meet处”出发,ab的速度相同,则在相同时间内,a走过L1的距离,此时b一定是走过L2 - L3的距离,所以a,b最终会在环入口处相遇。

这里写图片描述

综上,算法的步骤如下:
Step1. 设置两个快慢指针,p,q。p每次向前走一步,q每次向前走两步,即:p = p.next ; q = q.next.next。
Step2. p、q向前走,直到相遇。相遇位置记为“meet处”。
Step3. 设置两个指针a,b。a从起点出发,b从“meet处”出发,直到相遇,相遇位置就是环的入口节点。

/*public class ListNode {int val;ListNode next = null;ListNode(int val) {this.val = val;}
}
*/
public class Solution {public ListNode EntryNodeOfLoop(ListNode head) {ListNode entryNode = null;// Step1. 设置两个快慢指针,p,qListNode slow = head, fast = head, meet = null;// Step2. p、q向前走,直到相遇。相遇位置记为“meet处”。while(fast != null && fast.next != null) {slow = slow.next;fast = fast.next.next;if(slow == fast) {meet = slow;break;}}// 设置两个指针a,b。a从起点出发,b从“meet处”出发,// 直到相遇,相遇位置就是环的入口节点。if(meet != null) {slow = head;fast = meet;while(slow != null && fast != null) {if(slow == fast) {entryNode = slow;break;}slow = slow.next;fast = fast.next;}}    }        return entryNode;}    
}

这篇关于面试题56. 链表中环的入口结点的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/989296

相关文章

Java面试题:通过实例说明内连接、左外连接和右外连接的区别

在 SQL 中,连接(JOIN)用于在多个表之间组合行。最常用的连接类型是内连接(INNER JOIN)、左外连接(LEFT OUTER JOIN)和右外连接(RIGHT OUTER JOIN)。它们的主要区别在于它们如何处理表之间的匹配和不匹配行。下面是每种连接的详细说明和示例。 表示例 假设有两个表:Customers 和 Orders。 Customers CustomerIDCus

LeetCode--234 回文链表

题目 请判断一个链表是否为回文链表。 示例 示例 1:输入: 1->2输出: false示例 2:输入: 1->2->2->1输出: true /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val

LeetCode--206 反转链表

题目 反转一个单链表。 示例 示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL class Solution {public:ListNode* reverseList(ListNode* head) {if (head == nullptr || head->next == nullptr){return head;}ListNo

剑指offer(C++)--两个链表的第一个公共结点

题目 输入两个链表,找出它们的第一个公共结点。 解法一 两个链表一定有交点的话,方法是指向短链表指针先走完,然后指向长链表,指向长链表指针后走完,指向短链表。所以,第二次走过,一定会在交点相遇。 class Solution {public:ListNode* FindFirstCommonNode( ListNode *pHead1, ListNode *pHead2) {ListN

【SparkStreaming】面试题

Spark Streaming 是 Apache Spark 提供的一个扩展模块,用于处理实时数据流。它使得可以使用 Spark 强大的批处理能力来处理连续的实时数据流。Spark Streaming 提供了高级别的抽象,如 DStream(Discretized Stream),它代表了连续的数据流,并且可以通过应用在其上的高阶操作来进行处理,类似于对静态数据集的操作(如 map、reduce、

Java线程面试题(50)

不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题。Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员的欢迎。大多数待遇丰厚的Java开发职位都要求开发者精通多线程技术并且有丰富的Java程序开发、调试、优化经验,所以线程相关的问题在面试中经常会被提到。 在典型的Java面试中, 面试官会从线程的基本概念问起, 如:为什么你需要使用线程,

算法6— 判断两个链表是否相交

问题: 给出两个单向链表的头指针,比如h1、h2,判断链表是否相交,如果不相交返回NULL;如果相交,返回指向第一个相交节点的指针。时间复杂度控制在O(n)。 分析: 如果两单向链表相交的话,一定是Y型相交,不可能出现X型,弄清楚这点后接下来的工作就是: (1)先找到h1,h2的最后一个节点L1和L2,同时记录节点数量a,b;(这里假设 a > b) (2)判断最后一个节点是否相同

剑指Offer—编程题56(链表中环的入口地址)

题目:一个链表中包含环,如何找出环的入口结点? 解题思路   可以用两个指针来解决这个问题。先定义两个指针P1和P2指向链表的头结点。如果链表中环有n个结点,指针P1在链表上向前移动n步,然后两个指针以相同的速度向前移动。当第二个指针指向环的入口结点时,第一个指针已经围绕着环走了一圈又回到了入口结点。    剩下的问题就是如何得到环中结点的数目。我们在面试题15的第二个相关题目时用到

剑指Offer—编程题15(链表中倒数第k个结点)

题目:输入一个链表,输出该链表中倒数第k 个结点.为了符合大多数人的习惯,本题从1 开始计数,即链表的尾结点是倒数第1 个结点.例如一个链表有6 个结点,从头结点开始它们的值依次是1 、2、3、4、5 、6。这个个链表的倒数第3 个结点是值为4 的结点. public static class ListNode {int value;ListNode next;} 解题思路:

Java数据结构4-链表

1. ArrayList的缺陷 由于其底层是一段连续空间,当在ArrayList任意位置插入或者删除元素时,就需要将后序元素整体往前或者往后搬移,时间复杂度为O(n),效率比较低,因此ArrayList不适合做任意位置插入和删除比较多的场景。因此:java集合中又引入了LinkedList,即链表结构。 2. 链表 2.1 链表的概念及结构 链表是一种物理存储结构上非连续存储结构,数据元素