2022-5-10 链表
给你一个链表的头节点 head
,判断链表中是否有环。
如果链表中有某个节点,可以通过连续跟踪 next
指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos
来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos
不作为参数进行传递 。仅仅是为了标识链表的实际情况。
如果链表中存在环 ,则返回 true
。 否则,返回 false
。
1 /** 2 * Definition for singly-linked list. 3 * class ListNode { 4 * int val; 5 * ListNode next; 6 * ListNode(int x) { 7 * val = x; 8 * next = null; 9 * } 10 * } 11 */ 12 public class Solution { 13 public boolean hasCycle(ListNode head) { 14 ListNode fast=head,slow=head; 15 while (fast!=null&&fast.next!=null){ 16 fast=fast.next.next; 17 slow=slow.next; 18 if (fast==slow) return true; 19 } 20 return false; 21 } 22 }
思路:快慢指针,如果相交有环,否则没有。
给定一个链表的头节点 head
,返回链表开始入环的第一个节点。 如果链表无环,则返回 null
。
如果链表中有某个节点,可以通过连续跟踪 next
指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos
来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos
是 -1
,则在该链表中没有环。注意:pos
不作为参数进行传递,仅仅是为了标识链表的实际情况。
不允许修改 链表。
1 /** 2 * Definition for singly-linked list. 3 * class ListNode { 4 * int val; 5 * ListNode next; 6 * ListNode(int x) { 7 * val = x; 8 * next = null; 9 * } 10 * } 11 */ 12 public class Solution { 13 public ListNode detectCycle(ListNode head) { 14 ListNode fast=head,slow=head; 15 while (fast!=null&&fast.next!=null){ 16 fast=fast.next.next; 17 slow=slow.next; 18 if (fast==slow) break; 19 } 20 if (fast==null||fast.next==null) return null; 21 fast=head; 22 while (fast!=slow){ 23 fast=fast.next; 24 slow=slow.next; 25 } 26 return fast; 27 } 28 }
思路:如果有环,在相遇点处让快指针从头开始,则快慢指针必定在环处相交。可数学推导。