【leetcode-141】环形链表

简介: 解题思路环形链表我们很容易想到用一个 Set 集合,遍历链表把每一个节点加入到集合里,如果某个节点已经存在集合中,说明链表有环,但是题目要求用 O(1) 的空间复杂度,如果用 Set 的话就引入了额外的空间,空间复杂度是 O(n) 不满足题目要求,另外一种常见的思路是快慢指针,慢指针一次走一步,快指针一次走两步,如果链表有环的话,快慢指针一定会相遇,如果没环的话,快慢指针一定不会相遇,可以想象成两个人在学校操场跑步,跑的快的人的速度是跑的慢的人速度的两倍,因为操场是圆形的,所以跑的快的人和跑的慢的人一定会再次相遇,也就是跑的快的人超了跑的慢的人一圈的时候。

题目描述



解题思路


环形链表我们很容易想到用一个 Set 集合,遍历链表把每一个节点加入到集合里,如果某个节点已经存在集合中,说明链表有环,但是题目要求用 O(1) 的空间复杂度,如果用 Set 的话就引入了额外的空间,空间复杂度是 O(n) 不满足题目要求,另外一种常见的思路是快慢指针,慢指针一次走一步,快指针一次走两步,如果链表有环的话,快慢指针一定会相遇,如果没环的话,快慢指针一定不会相遇,可以想象成两个人在学校操场跑步,跑的快的人的速度是跑的慢的人速度的两倍,因为操场是圆形的,所以跑的快的人和跑的慢的人一定会再次相遇,也就是跑的快的人超了跑的慢的人一圈的时候。


代码实现


哈希表


/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public boolean hasCycle(ListNode head) {
        if (head == null) return false;
        Set<ListNode> set = new HashSet<>();
        while (head != null) {
            if (!set.add(head)) {
                return true;
            }
            head = head.next;
        }
        return false;
    }
}


快慢指针


/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public boolean hasCycle(ListNode head) {
        if (head == null) return false;
        ListNode fast = head;
        ListNode slow = head;
        while (fast.next != null && fast.next.next != null) {
            slow = slow.next;
            fast = fast.next.next;
            if (slow == fast) {
                return true;
            }
        }
        return false;
    }
}


提交记录


相关文章
|
4天前
|
Java
环形数组链表(java)
环形数组链表(java)
6 0
|
19天前
|
存储 SQL 算法
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
|
12天前
|
算法 Java
[Java·算法·中等] LeetCode21. 合并两个有序链表
[Java·算法·中等] LeetCode21. 合并两个有序链表
15 2
|
15天前
|
Java Python
二刷力扣--链表
二刷力扣--链表
|
19天前
|
存储 SQL 算法
LeetCode 题目 86:分隔链表
LeetCode 题目 86:分隔链表
|
19天前
|
存储 算法 数据可视化
深入解析力扣160题:相交链表的解决方法(哈希表法与双指针法详细图解)
深入解析力扣160题:相交链表的解决方法(哈希表法与双指针法详细图解)
|
19天前
|
SQL 算法 数据可视化
LeetCode题目92:反转链表ll 【python 递归与迭代方法全解析】
LeetCode题目92:反转链表ll 【python 递归与迭代方法全解析】
|
4天前
|
Java
单向环形链表-约瑟夫问题(java)
单向环形链表-约瑟夫问题(java)
7 0
|
4天前
|
存储 算法 C语言
【数据结构与算法 刷题系列】环形链表的约瑟夫问题
【数据结构与算法 刷题系列】环形链表的约瑟夫问题
|
16天前
|
算法
【经典LeetCode算法题目专栏分类】【第7期】快慢指针与链表
【经典LeetCode算法题目专栏分类】【第7期】快慢指针与链表