• 【leetcode】141. 环形链表 142. 环形链表 II


    题目:141. 环形链表 - 力扣(LeetCode) (leetcode-cn.com)

    思路:

      判断链表是否有环,可以用到快慢指针的思想。如果链表有环的话,快慢指针在移动的过程中一定会相遇;反之链表没有环的话,快慢指针就不会相遇

    算法:

    1.先声明慢指针slow和快指针fast,都指向头节点。

    ListNode slow=head,fast=head;
    

    2.移动指针slow和fast。这里需要有情况需要考虑的:

    2.1如果链表是有环的,那么指针slow和fast永远不会指向null;

    2.2 如果链表是没有环的,slow和fast除了一开始指针头节点是相等的,后面是永远不可能相遇的,且还有下面两种情况;

    2.2.1 链表无环只有1个节点,则fast.next = null。slow和fast是不能像后移动的,可以通过fast.next == null 是无环的

    2.2.1 链表无环只有2个节点,则fast.next.next = null。slow和fast是不能像后移动的,可以通过fast.next == null 是无环的

    综上 当fast.next != null 且 fast.next.next != null时,链表可能是有环,反之,一定是无环的

    代码如下:

    /**
     * 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 slow = head,fast=head;
    
            while(fast.next != null && fast.next.next != null){
                slow = slow.next;
                fast = fast.next.next;
    
                if(slow == fast){
                    return true;
                }
            }
    
            return false;
        }
    }

    题目:142. 环形链表 II - 力扣(LeetCode) (leetcode-cn.com)

    思路:

      快慢指针Fast、Slow相遇时,让其中任一个指针指向头节点,以相等的速度前进时,指针再次相遇的时候,指针指向的即可入环的第一个节点。

    原理:

      当fast和slow相遇的时候,假设slow走了k步,则fast一定走了2k步。且k为环的长度的整数倍数。

      我们假设环的起点距离相遇点的距离为m步,则根据在相遇点slow已经走了k步,则头节点距离环起点是k-m步。从相遇点开始 再走k-m步,也恰好到达环起点。

    代码:

    /**
     * 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) {
            if(head == null){
                return null;
            }
            ListNode slow=head,fast = head;
            while(fast.next != null && fast.next.next != null){
                slow = slow.next;
                fast = fast.next.next;
                if(slow == fast){
                    break;
                }
            }
    
            // 说明无环的情况
            if(fast.next == null || fast.next.next == null){
                return null;
            }
            // 让慢指针指向头节点
            slow = head;
            while(slow != fast){
                slow = slow.next;
                fast = fast.next;
            }
    
            return slow;
        }
    }
  • 相关阅读:
    elasticsearch插件开发
    elasticsearch启动流程
    HBase结构
    Scala统计一个文件所有单词出现的次数
    es基础知识
    Linux中Swap与Memory内存简单介绍
    linux 常用命令
    巅峰对决之Swarm、Kubernetes、Mesos
    【JS】JS知识小结
    【HTTP】HTTP状态码详解
  • 原文地址:https://www.cnblogs.com/xiangshigang/p/16211801.html
Copyright © 2020-2023  润新知