【leetcode】141. 环形链表 142. 环形链表 II
题目:141. 环形链表 - 力扣(LeetCode) (leetcode-cn.com)
思路:
判断链表是否有环,可以用到快慢指针的思想。如果链表有环的话,快慢指针在移动的过程中一定会相遇;反之链表没有环的话,快慢指针就不会相遇
算法:
1.先声明慢指针slow和快指针fast,都指向头节点。
1 | ListNode slow=head,fast=head; |
2.移动指针slow和fast。这里需要有情况需要考虑的:
2.1如果链表是有环的,那么指针slow和fast永远不会指向null;
2.2 如果链表是没有环的,slow和fast除了一开始指针头节点是相等的,后面是永远不可能相遇的,且还有下面两种情况;
2.2.1 链表无环只有1个节点,则fast.next = null。slow和fast是不能像后移动的,可以通过fast.next == null 是无环的
2.2.1 链表无环只有2个节点,则fast.next.next = null。slow和fast是不能像后移动的,可以通过fast.next == null 是无环的
综上 当fast.next != null 且 fast.next.next != null时,链表可能是有环,反之,一定是无环的
代码如下:
/** * Definition for singly-linked list. * class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */ public class Solution { public boolean hasCycle(ListNode head) { if(head == null){ return false; } ListNode slow = head,fast=head; while(fast.next != null && fast.next.next != null){ slow = slow.next; fast = fast.next.next; if(slow == fast){ return true; } } return false; } }
题目:142. 环形链表 II - 力扣(LeetCode) (leetcode-cn.com)
思路:
快慢指针Fast、Slow相遇时,让其中任一个指针指向头节点,以相等的速度前进时,指针再次相遇的时候,指针指向的即可入环的第一个节点。
原理:
当fast和slow相遇的时候,假设slow走了k步,则fast一定走了2k步。且k为环的长度的整数倍数。
我们假设环的起点距离相遇点的距离为m步,则根据在相遇点slow已经走了k步,则头节点距离环起点是k-m步。从相遇点开始 再走k-m步,也恰好到达环起点。
代码:
/** * 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) { if(head == null){ return null; } ListNode slow=head,fast = head; while(fast.next != null && fast.next.next != null){ slow = slow.next; fast = fast.next.next; if(slow == fast){ break; } } // 说明无环的情况 if(fast.next == null || fast.next.next == null){ return null; } // 让慢指针指向头节点 slow = head; while(slow != fast){ slow = slow.next; fast = fast.next; } return slow; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了