标签:tree 小数 alt null 如何 code 暴力 none loop
重磅干货,第一时间送达链表中环的入口结点
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出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之前,总的说它有三个优点:
它的缺点是:
剑指offer刷题交流群
扫码添加微信,一定要备注研究方向+地点+学校+昵称(如机器学习+上海+上交+汤姆),只有备注正确才可以加群噢。
▲长按加群
每日算法题 | 剑指offer 链表专题 (7) 链表中环的入口结点
标签:tree 小数 alt null 如何 code 暴力 none loop
原文地址:https://blog.51cto.com/15054042/2564452