首页 > 其他分享 >141. 环形链表 及其相关

141. 环形链表 及其相关

时间:2023-06-20 21:55:44浏览次数:44  
标签:head slow ListNode 141 环形 fast next 链表 null

141. 环形链表

1.哈希表法:

将节点依次加入set,如果有重复就是有环。

public class Solution {
    public boolean hasCycle(ListNode head) {
        Set<ListNode> set = new HashSet<ListNode>();
        while(head!=null){
            if(!set.add(head)){
                return true;
            }
            head = head.next;
        }

        return false;
    }
}

2.快慢指针

public class Solution {
    public boolean hasCycle(ListNode head) {
        ListNode fast = head;
        ListNode slow = head;
        while(fast!=null&&fast.next!=null){
            slow = slow.next;
            fast = fast.next.next;
            if(slow==fast){
                return true;
            }
        }

        return false;
    }
}

如果有环,快慢指针迟早都会进入环,只要快指针比慢指针快1步,迟早能追上,而不会跨过。同理慢指针两步。快指针三步也可以。

//如下,快指针三步,慢指针两步。
public class Solution {
    public boolean hasCycle(ListNode head) {
        ListNode fast = head;
        ListNode slow = head;
        while(fast!=null&&fast.next!=null&&fast.next.next!=null){
            slow = slow.next.next;
            fast = fast.next.next.next;
            if(slow==fast){
                return true;
            }
        }

        return false;
    }
}

环形链表 II https://leetcode.cn/problems/linked-list-cycle-ii/solutions/12616/linked-list-cycle-ii-kuai-man-zhi-zhen-shuang-zhi-/

哈希表简单容易理解,就是空间复杂度是O(N)

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

双指针

参考大神:
作者:Krahets
链接:https://leetcode.cn/problems/linked-list-cycle-ii/solutions/12616/linked-list-cycle-ii-kuai-man-zhi-zhen-shuang-zhi-/

public class Solution {
    public ListNode detectCycle(ListNode head) {
        ListNode fast = head, slow = head;
        while (true) {
            if (fast == null || fast.next == null) return null;
            fast = fast.next.next;
            slow = slow.next;
            if (fast == slow) break;
        }
        fast = head;
        while (slow != fast) {
            slow = slow.next;
            fast = fast.next;
        }
        return fast;
    }
}

注意:如果慢指针是两步,快指针是三步,也是可以的。相当于f=3/2s f = s+nb 消完后还是可以的,能通过测试用例

public class Solution {
    public ListNode detectCycle(ListNode head) {
        ListNode fast = head, slow = head;
        while (true) {
            if (fast == null || fast.next == null||fast.next.next == null) return null;
            fast = fast.next.next.next;
            slow = slow.next.next;
            if (fast == slow) break;
        }
        fast = head;
        while (slow != fast) {
            slow = slow.next;
            fast = fast.next;
        }
        return fast;
    }
}

标签:head,slow,ListNode,141,环形,fast,next,链表,null
From: https://www.cnblogs.com/chenyi502/p/17494929.html

相关文章

  • SQL语句_链表(下)
    Store_Info表:store_namesalesdateA50001-01-2000B20002-01-2000A150002-10-2000D100003-08-2000Sales表:salesdate20002-01-2000100003-08-200060004-08-200075005-08-2000表链接查询除了可以使用JOIN,还可以使......
  • 关于线性结构中的双向链表如何实现?
    前言在上一篇文章中,主要是给大家介绍了单向链表的特点及其原理,但是我们没有通过代码进行练习。今天我会继续通过一篇文章,来给大家讲解双向链表的内容,尤其是会通过代码来进行链表的操作,希望大家重点关注哦。全文大约【3500】字,不说废话,只讲可以让你学到技术、明白原理的纯干货!......
  • 单链表(双指针)
    #include<stdio.h>#include<stdlib.h>#include<time.h>typedefstructNode{intvalue;structNode*pNext;}Node;/*打印链表*/voidshow_data(Node*head){if(head==NULL){return;}Node*cur=head;......
  • 【数据结构】带头双向循环链表
    ......
  • SQL语句_链表(上)
    说到连表查询,我们先了解下别名。别名可以用在表上,也可以用在表中参数名。即 SELECT"表格别名"."表中参数名""表中参数别名"FROM“表格名” "表格别名" 或 SELECT"表格别名"."表中参数名"AS"表中参数别名"FROM“表格名”AS"表格别名" 举个例子 SELECTSI.st......
  • 删除链表的倒数第n个节点
    描述给定一个链表,删除链表的倒数第 n 个节点并返回链表的头指针例如,给出的链表为: 1→2→3→4→5,n=2.删除了链表的倒数第 n 个节点之后,链表变为1→2→3→5. 数据范围: 链表长度 0≤n≤1000,链表中任意节点的值满足 0≤val≤100要求:空间复杂度 O(1),时间复杂度 O(......
  • 【基础算法】单链表的OJ练习(5) # 环形链表 # 环形链表II # 对环形链表II的解法给出证
    前言本章的OJ练习相对于OJ练习(4)较为简单。不过,本章的OJ最重要的是要我们证明为何可以这么做。这也是==面试==中常出现的。对于OJ练习(4):==->==传送门==<-==,分割链表以一种类似于归并的思想解得,回文链表以一种巧妙复用前面OJ题的思想解得。啰嗦一下:对于本章,最重要的是......
  • 反转链表
    反转链表题目:反转一个单链表。示例:输入:1->2->3->4->5->NULL输出:5->4->3->2->1->NULL解题思路:在纸上画一画,找到规律就可以写出来/***Definitionforsingly-linkedlist.*publicclassListNode{*intval;*ListNodenext;*ListNode(intx)......
  • 环形链表
    环形链表题目:给定一个链表,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链表中存在环。为了表示给定链表中的环,我们使用整数pos来表示链表尾连接到链表中的位置(索引从0开始)。如果pos是-1,则在该链表中没有环。注意:pos不作为参数进行传......
  • 删除链表的倒数第N个节点
    删除链表的倒数第N个节点给定一个链表,删除链表的倒数第n个节点,并且返回链表的头结点。示例:给定一个链表:1->2->3->4->5,和n=2.当删除了倒数第二个节点后,链表变为1->2->3->5.说明:给定的n保证是有效的。解题思路:用两个指针一前一后遍历链表,两者相差n+1个节点,当前......