美文网首页LeetCode每日一题
LeetCode每日一题:环形链表

LeetCode每日一题:环形链表

作者: Patarw | 来源:发表于2020-08-05 08:25 被阅读0次

思路一:哈希表

利用哈希表判断节点是否一样,因为把head存进哈希表的时候,会对应一个唯一的key值,遍历链表的时候只需要对比key值是否存在于哈希表中即可判断是否为环形链表。
时间复杂度:O(n)
空间复杂度:O(n)

  • 代码:
  public class Solution {
public boolean hasCycle(ListNode head) {
    if(head == null){
        return false;
    }
    Set<ListNode> nodes = new HashSet<>();      
    while(head != null){
       if(nodes.contains(head)){
           return true;
       }else{
           nodes.add(head);
       }
       head = head.next;
    }
    return false;
}
}

思路二:快慢双指针

定义快慢两个指针,如果链表没有环形结构,那么最快的指针就会最先到达尾部,完成遍历,如果有环形结构,那么快指针肯定会追上慢指针,当两个指针重合时即可判断其含有环形结构

  • 代码:
public class Solution {
public boolean hasCycle(ListNode head) {
    if(head == null){
        return false;
    }
    ListNode slow = head;
    ListNode quick = head.next;  
    while(slow != quick){
      if(quick == null || quick.next == null){
          return false;
      }
      quick = quick.next.next;
      slow = slow.next;
    }
    return true;
}
}

相关文章

网友评论

    本文标题:LeetCode每日一题:环形链表

    本文链接:https://www.haomeiwen.com/subject/tqfsrktx.html