重磅干货,第一时间送达java
链表中环的入口结点程序员
给一个链表,若其中包含环,请找出该链表的环的入口结点,不然,输出null。面试
先看一张图,首先A是起点,C是环的入口点,B是指针的相遇点正则表达式
既然要相遇,那必然是两个指针的相遇。那他的快慢程度如何肯定?
咱们假设快指针fast一次走2步,慢指针slow一次走1步,每次拉开的差距就是1步,因为咱们知道这个链表是个环,那么这样快指针fast必定能够遇上slow(至关因而套圈),fast恰好比slow多走了一圈环的长度。。算法
固然以上只是思路的第一步,第二步相遇以后你要怎么作?相遇的地点咱们能计算出来吗?
假设id=a是入环处,c是入环处a的上一节点。
如今咱们求出了相遇点是在id=c-a+1的位置,成功了一大半了。(感受用电脑画图比较费时间你们将就看)
如今id=c-a处离环的入口处距离为a,此时发现与咱们的链表平铺长度c无关!数组
最后一步:调整指针,将一个指针放在id=c-a+1处,一个指针放在id=0处,每次移动一个,相遇便是入口处!微信
# -*- coding:utf-8 -*- # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution: def EntryNodeOfLoop(self, pHead): # write code here slow,fast=pHead,pHead while fast and fast.next: slow=slow.next fast=fast.next.next if slow==fast: slow=pHead while slow!=fast: slow=slow.next fast=fast.next return slow
import java.util.*;数据结构
public class Solution { public ListNode EntryNodeOfLoop(ListNode pHead) { if(pHead==null) return null; ListNode pNode=pHead; HashSet<ListNode> pSet = new HashSet<ListNode>(); while(pNode!=null){ if(!pSet.add(pNode)) return pNode; pNode=pNode.next; } return null; } }
注:面试季来了,不论是做为面试者仍是之后做为面试官,了解算法这门程序员之间的沟通方式都是很是必要的。找过工做的朋友应该都据说过《剑指offer》,虽然书中只有六十多道题目,可是道道都是经典。机器学习
若是是单纯的面试需求,剑指offer的优先级确定是在Leetcode以前,总的说它有三个优势:ide
它的缺点是:
剑指offer刷题交流群
扫码添加微信,必定要备注研究方向+地点+学校+昵称(如机器学习+上海+上交+汤姆),只有备注正确才能够加群噢。
▲长按加群