本题在上个环形链表的基础上增加了难度,让找其环形链表的第一个节点
还是原先的思路,定义快慢指针
在第一次快慢指针相等时,a是到环形前的节点个数,k是离环形节点有多远
快指针走了a+n圈环形+k
慢指针走了a+m圈环形+k
此时快指针走的路程是慢指针2倍。慢指针= 快指针-慢指针 = n圈环形 ,这里的n的值和上面n不一样,你们懂我意思就可以
从起点开始算a+n圈环形就是环形链表的起始节点所以,此时慢指针在加上a的长度就可以找到起始节点,可以将快指针变成头节点,每次和慢指针一样都只走一步
public class A07detectCycle {
public ListNode detectCycle(ListNode head) {
ListNode slow = head;
ListNode fast = head;
while (fast != null && fast.next!= null){
slow = slow.next;
fast = fast.next.next;
if (slow == fast){
fast = head;//将快指针从头节点重新遍历
while (slow != fast){
slow = slow.next;
fast = fast.next;
}//完成对慢指针加a
return slow;
}
}
return null;
}
class ListNode {
int val;
ListNode next;
ListNode() {
}
ListNode(int val) {this.val = val;}
ListNode(int val, ListNode next) {this.val = val;this.next = next;}
}
}
标签:----,slow,Java,环形,fast,next,链表,ListNode,指针
From: https://blog.csdn.net/m0_74117790/article/details/144808318