[LeetCode 142] Linked List Cycle II

134 篇文章 0 订阅
49 篇文章 0 订阅

题目链接:linked-list-cycle-ii


/**
 * 
		Given a linked list, return the node where the cycle begins. If there is no cycle, return null.
		
		Follow up:
		Can you solve it without using extra space?
 *
 */

public class LinkedListCycleII {

//	16 / 16 test cases passed.
//	Status: Accepted
//	Runtime: 214 ms
//	Submitted: 29 minutes ago

	
	public class ListNode {
		int val;
		ListNode next;
		ListNode(int x) {
			val = x;
			next = null;
		}
	}
	
	//解题思路:
	
	//设置两个指针,slow每走一步,fast走两步
	//如果有环,则在环内某点相遇,此时slow走的距离为 d,	fast走的距离为 2d
	//当其相遇时,fast指针已经在环内走了 n 圈
	//设环的长度为R
	//故对于 fast指针 2d = d + n * R
	//可知 d = n * R
	
	//设入口点到相遇点的距离为 x
	//则头指针到入口点的距离为 d - x
	
	//我们可以向后推一下,如果 fast少走x步,那是不是就是环的入口点
	//即 d - x = n * R - x
	//那么可以在fast和slow相遇后,从头指针设置一个新的指针 p
	// p 和slow 同步前进
	//当p走了 d - x 步时,	slow 走了 n * R - x步时,在环入口点相遇
	
	
	
	//时间复杂度O(n) ,空间复杂度 O(1)
    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) {
        		ListNode p = head;
        		while(slow != p) {
        			slow = slow.next;
        			p = p.next;
        		}
        		return p;
        	}
        }
        return null;
    }
	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值