【LeetCode每日一题】[中等]142. 环形链表 II

【LeetCode每日一题】[中等]142. 环形链表 II

142. 环形链表 II

题目来源
算法思想:链表,指针,哈希表
题目:
今天的题目描述,一言难尽,
题目: 给定一个链表,返回环起的节点
在这里插入图片描述思路.

java代码–哈希表

一个非常直观的思路是:我们遍历链表中的每个节点,并将它记录下来;一旦遇到了此前遍历过的节点,就可以判定链表中存在环。借助哈希表可以很方便地实现。

public class Solution {
    
    
	//返回起环的节点
    public ListNode detectCycle(ListNode head) {
    
    
		Set<ListNode> m = new HashSet<ListNode>();//用来标记存在的节点
		ListNode pos = head;//指针pos
		while(pos != null) {
    
    
			if (m.contains(pos)) {
    
    //如果当前节点存在,即存在环,返回当前节点
				return pos;
			}
			else {
    
    //不存在,则将该节点加入哈希表
				m.add(pos);
			}
			pos = pos.next;//指针下移
		}
		return null;
    }
}

java代码–指针,赛跑

PS:赛跑的方法很巧妙,详细描述如下:
在这里插入图片描述

public class Solution {
    
    
	//返回起环的节点
    public ListNode detectCycle(ListNode head) {
    
    
		ListNode fast = head;//快指针
		ListNode slow = head;//慢指针
		while(fast != null) {
    
    
			if (fast.next != null) {
    
    //快指针移动两格,慢指针移动一格
				fast = fast.next.next;
				slow = slow.next;
			}
			else {
    
    
				return null;
			}
			if (fast == slow) {
    
    //相遇,停止
				break;
			}
		}
		if (fast == null) {
    
    //如果无环,返回null
			return null;
		}
		ListNode pos = head;//有环
		while (slow != pos) {
    
    //同时移动,相遇于起环位置
			pos = pos.next;
			slow = slow.next;
		}
		return pos;//返回起环位置
    }
}

猜你喜欢

转载自blog.csdn.net/qq_39457586/article/details/108996378