Leetcode 142 环形链表II(链表:快2慢1指针相遇即有环)

编程入门 行业动态 更新时间:2024-10-19 04:30:32

Leetcode 142 环形<a href=https://www.elefans.com/category/jswz/34/1769662.html style=链表II(链表:快2慢1指针相遇即有环)"/>

Leetcode 142 环形链表II(链表:快2慢1指针相遇即有环)

Leetcode 142 环形链表II(链表:快2慢1指针相遇即有环)

    • 解法1


/

解法1

🔴1.【有无环】快慢指针,快指针每次走两步,慢指针每次走一步,若相遇( fast = slow)则说明有环
// 快2慢1指针,开始俩人跑啊跑,快的走的快,慢的走的慢
// 之后快的先进环,慢的后进环
// 如果有环的话,那么在环里快的一定可以追上慢的
// 即:【追上即有环,追不上就木有】

🔴2.【在哪里是环的入口】之后数学推导可知入口索引x = (n-1)(y+z) + z,即让index1 = head,index2 = fast = slow,这两个相遇时的index1= index2 = x,即为所求

时间复杂度O(N)
其中 N 为链表中节点的数目。在最初判断快慢指针是否相遇时,slow 指针走过的距离不会超过链表的总长度;随后寻找入环点时,走过的距离也不会超过链表的总长度。因此,总的执行时间为 O(N)+O(N)=O(N)。

空间复杂度O(1)

/*** Definition for singly-linked list.* class ListNode {*     int val;*     ListNode next;*     ListNode(int x) {*         val = x;*         next = null;*     }* }*/
public class Solution {public ListNode detectCycle(ListNode head) {ListNode fast = head;ListNode slow = head;// fast每次走两步,slow每次走一步while(fast != null && fast.next != null){fast = fast.next.next;slow = slow.next;// // 如果fast和slow可以相遇则说明有环if(fast == slow){// 寻找入口位置即返回x ,x = (n-1)(y+z) + z// 即再让index1 和 index2 相遇ListNode index1 = head;ListNode index2 = slow;while(index1 != index2){index1 = index1.next;index2 = index2.next;} return index1;}}return null; }
}

更多推荐

Leetcode 142 环形链表II(链表:快2慢1指针相遇即有环)

本文发布于:2023-12-07 13:17:03,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1671293.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:链表   环形   指针   Leetcode   II

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!