12.【链表】Linked List Cycle--Accepted code

来源:互联网 发布:软件售后服务承诺英文 编辑:程序博客网 时间:2024/05/21 09:10

leetcode URL:https://leetcode.com/problems/linked-list-cycle/
解法1 用Hashset实现,利用HashSet在add重复节点时会返回false的特性。

/** * 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;        HashSet<ListNode> nodeSet=new HashSet<>();        ListNode p=head;        nodeSet.add(p);        while(p.next!=null){            if(!nodeSet.add(p.next)) return true;            p=p.next;        }        return false;    }}

解法二 快慢指针

/** * 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 s=head;        ListNode f=head;        while(f!=null && f.next!=null && f.next.next!=null){//判断f.next.next是否为空之前需要先判断f和f.next是否为空,否则会NPE            s=s.next;            f=f.next.next;            if(s==f) return true;        }        return false;    }}

注意:判断f.next.next是否为空之前需要先判断f和f.next是否为空,否则会NPE

0 0