leetcode141.环形链表

题目

给定一个链表,判断链表中是否有环。

为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。(测试用例,没什么关系)

示例代码

使用hashset

	public boolean hasCycle(ListNode head) {
		ListNode curr = head;
		HashSet<ListNode> set = new HashSet<>();
		while (curr != null) {
			if (set.contains(curr)) {
				return true;
			} else {
				set.add(curr);
			}
			curr = curr.next;
		}
		return false;
    }

要点

  • 利用set的不可重复性:每走一步都记录下结点,如果在set中包含了当前节点说明已经走过了,即出现了环
  • 时间O(n),空间:借助set,每个节点都要存放,O(n)

注意:泛型中放的是ListNode不是Integer,当时一直犯迷糊,题目也没说结点值一定不重复啊,为啥要用set

使用快慢指针

	public boolean hasCycle(ListNode head) {
		if (head == null || head.next == null) {
			return false;
		}
		ListNode fast = head;
		ListNode slow = head;
		while (true) {
			slow = slow.next;
			fast = fast.next.next;
			if (slow == fast) {
				return true;
			}
			if (fast == null || fast.next == null) {
				return false;
			}
		}
    }

要点

  • 快慢指针:快指针每次走两步,慢指针每次走一步,如果成环,快指针一定会追上慢指针
  • 时间:O(n)空间:O(1) (题目要求O(1)空间复杂度,所以第一种就不合适了)

实现很简单,不过一般人不好往这儿想吧,这应该是高级玩家的玩法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值