首页 » Web前端 » php链表中环的进口技巧_每日算法之链表中环的进口结点

php链表中环的进口技巧_每日算法之链表中环的进口结点

访客 2024-10-26 0

扫一扫用手机浏览

文章目录 [+]
小编JZ23 链表中环的入口结点描述

给一个长度为n链表,若个中包含环,请找出该链表的环的入口结点,否则,返回null。
解析

环很大在前面我们提到过快慢指针,判断是否有环。

php链表中环的进口技巧_每日算法之链表中环的进口结点

如果有环,在来找环的入口。
如果没环直接返回null即可,我们假设是有环的,那么会有两种情形,一种是O型,一种是6型,实在事理都一样,这里紧张看一下6字型的环,他会有两种情形,如果有环,那么快指针走过的路径便是图中a+b+c+b,慢指针走过的路径便是图中a+b,由于在相同的韶光内,快指针走过的路径是慢指针的2倍,以是这里有a+b+c+b=2(a+b),整理得到a=c在相遇的时候再利用两个指针,一个从链表起始点开始,一个从相遇点开始,每次他们都走一步,直到再次相遇,那么这个相遇点便是环的入口。
环很小这种情形下当快慢指针在环上相遇的时候,快指针有可能在环上转了好几圈,我们假设相遇的时候快指针已经在环上转了n圈。
那么相遇的时候快指针走过的路径便是a+b+(b+c)n,(b+c实在便是环的长度),慢指针走过的路径是a+b。
由于相同韶光内快指针走过的路径是慢指针的2倍。
以是有a+b+(b+c)n=2(a+b),整理得到a+b=n(b+c),也便是说a+b即是n个环的长度。
我们还可以利用两个指针,一个从链表的出发点开始,一个从相遇点开始,那么就会涌现一种情形便是,一个指针在路径a上走,一个指针一贯在环上转圈,终极会走到第一种情形。
代码

package mid.JZ23链表中环的入口结点;class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}public class Solution { public ListNode EntryNodeOfLoop(ListNode pHead) { ListNode slow = hasCycle(pHead); if (slow == null) return null; //快的回到出发点 ListNode fast = pHead; while(fast != slow) { fast = fast.next; slow = slow.next; } return fast; } / 判断链表是否有环 @param head @return / public ListNode hasCycle(ListNode head) { if (head == null) return null; ListNode fast = head; ListNode slow = head; while(fast != null && fast.next != null) { //快的走两步 fast = fast.next.next; //慢的走一步 slow = slow.next; //如果相同返回慢的指针 if (fast == slow) return slow; } return null; }}

php链表中环的进口技巧_每日算法之链表中环的进口结点
(图片来自网络侵删)

相关文章

dedeajax挪用php技巧_PHPAJAX 与 PHP

AJAX PHP 实例下面的实例将演示当用户在输入框中键入字符时,网页如何与 Web 做事器进行通信:实例考试测验在输入框中输入一...

Web前端 2024-12-07 阅读0 评论0

php新的特征技巧_PHP 7 新特点

PHP 7 中的函数的形参类型声明可以是标量了。在 PHP 5 中只能是类名、接口、array 或者 callable (PHP...

Web前端 2024-12-07 阅读0 评论0