141. Linked List Cycle

Posted clairexxx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了141. Linked List Cycle相关的知识,希望对你有一定的参考价值。

源地址:https://leetcode.com/problems/linked-list-cycle/

判断链表是否有环路

 

首先最开始想到的办法是存储访问过的节点,之后看当前节点的next是否指向已经遍历过的节点,这样的时间复杂度是O(n),空间复杂度也是O(n)。使用ArrayList存储会非常慢,使用hashmap存储大概运行时间6 ms, faster than 12.13% of Java online submissions for Linked List Cycle. 

public class Solution {
    public boolean hasCycle(ListNode head) {
        if(head == null){
            return false;
        }
        HashMap<ListNode, Integer> map = new HashMap<>();
        int i = 0;
        while(head!= null){
            map.put(head, i++);
            head = head.next;
            if(map.containsKey(head)){
                return true;
            }
        }
        return false;
    }
}

 

为了是空间复杂度降至O(1), 使用快慢指针的方法。如果存在环路, 那么快慢指针一定会在某一点相遇,就好像在操场上跑圈一样,快的人一定会赶上慢的人,

这样运行Runtime: 0 ms, faster than 100.00% of Java online submissions for Linked List Cycle.

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

 

以上是关于141. Linked List Cycle的主要内容,如果未能解决你的问题,请参考以下文章

141. Linked List Cycle

141. Linked List Cycle

141. Linked List Cycle

141. Linked List Cycle

算法分析如何理解快慢指针?判断linked list中是否有环找到环的起始节点位置。以Leetcode 141. Linked List Cycle, 142. Linked List Cycl(代码

141. Linked List Cycle