102.带环链表

描述

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

样例

给出 -21->10->4->5, tail connects to node index 1,返回 true

挑战

不要使用额外的空间

思路

  1. 使用O(n)的额外空间时,在遍历整个链表的过程中用一个hash表存储当前结点的引用,如果hash表中已经存在当前结点的引用return false,否则加入hash表,如果遍历完整个链表仍旧没发现重复值证明链表没环
  2. 定义两个指针,一个快一个慢,设定快的跑两步,慢的跑一步,如果有环则它们一定会相遇

两种思路时间复杂度都是O(n)

变形题目

题目有一种变体,就是判断两个链表有没有交集,将第一个链表的末指针和第二个链表的头指针连接到一起,若有交集则一定存在环

代码

/**
 * Definition for ListNode.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int val) {
 *         this.val = val;
 *         this.next = null;
 *     }
 * }
 */
  1. 哈希表法
public class Solution {
    /*
     * @param head: The first node of linked list.
     * @return: True if it has a cycle, or false
     */
    public boolean hasCycle(ListNode head) {
        Set<ListNode> nodesSeen = new HashSet<>();
        while (head != null) {
            if (nodesSeen.contains(head)) {
                return true;
            } else {
                nodesSeen.add(head);
            }
            head = head.next;
        }
        return false;
    }
}
  1. 快慢指针
public class Solution {
    /*
     * @param head: The first node of linked list.
     * @return: True if it has a cycle, or false
     */
    public boolean hasCycle(ListNode head) {
        if (head == null || head.next == null) {
            return false;
        }
        
        // 注意要让跑的快的在前面,不然没跑完一圈就追上了
        ListNode slow = head;
        // 如果 fast 也赋值为 head 则在第一个结点就会跳出 while 循环
        ListNode fast = head.next;
        while (slow != fast) {
            // 在没追上慢指针的情况下,遍历完了整个链表,证明没有环
            if (fast == null || fast.next == null) {
                return false;
            }
            fast = fast.next.next;
            slow = slow.next;
        }
        // slow == fast时证明有环
        return true;
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转载请注明出处://www.greatytc.com/p/c65d9d753c31 在上一篇博客《数据结构...
    Alent阅读 3,546评论 4 74
  • 大学的时候不好好学习,老师在讲台上讲课,自己在以为老师看不到的座位看小说,现在用到了老师讲的知识,只能自己看书查资...
    和珏猫阅读 1,490评论 1 3
  • 本文内容取自于小甲鱼的数据结构与算法。//www.greatytc.com/p/230e6fde9c75 ...
    阿阿阿阿毛阅读 2,956评论 0 7
  • 1. 链表 链表是最基本的数据结构,面试官也常常用链表来考察面试者的基本能力,而且链表相关的操作相对而言比较简单,...
    Mr希灵阅读 1,496评论 0 20
  • 本文涉及更多的是概念,代码部分请参考之前写过的 2 篇博客 基于Javascript的排序算法基本数据结构和查找算...
    faremax阅读 1,340评论 0 2