关闭

【Leetcode】Linked List Cycle II

409人阅读 评论(0) 收藏 举报
分类:

题目链接:https://leetcode.com/problems/linked-list-cycle-ii/

题目:

Given a linked list, return the node where the cycle begins. If there is no cycle, return null.

Note: Do not modify the linked list.

Follow up:
Can you solve it without using extra space?

思路:

首先确定循环是否存在,若存在,根据 循环结点个数/结点相对移动次数 就会相遇的规律 得到循环结点个数,再从头开始遍历,相对移动速度为结点个数,此时两指针第一次相遇的位置就是循环开始。

算法:

	public ListNode detectCycle(ListNode head) {
		ListNode q = head, p = null;
		boolean flag = false;
		// 确定循环存在
		if (q == null || q.next == null) {
			flag = false;
		} else {
			p = q.next.next;
			while (q != null) {
				if (q == p) {
					flag = true;
					break;
				}
				if (p == null || p.next == null) {
					flag = false;
					break;
				}
				p = p.next.next;
				q = q.next;
			}
			if (q == null) {
				flag = false;
			}
		}
		// ===找到循环开始节点
		if (flag == true) {
			p = q.next;//此时p/q都在循环中
			int length = 1;
			while (q != p) { // 确定循环节点长度
				p = p.next;
				length++;
			}
			q = head; 
			boolean status = true;
			while (status) {
				p = q;
				int tmp = length;
				while (--tmp >= 0) { // 指向q前length个节点p 
					p = p.next;
				}
				if (p == q) {//如果q等于开始q的前length个结点,此时p为循环开始
					status = false;
					head = p;
				}
				q = q.next;

			}
			return head;
		} else {
			return null;
		}
	}


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:536465次
    • 积分:8374
    • 等级:
    • 排名:第2628名
    • 原创:305篇
    • 转载:6篇
    • 译文:0篇
    • 评论:35条
    博客专栏
    文章分类
    最新评论