LeetCode141环形链表I、II

141. 环形链表

给定一个链表,判断链表中是否有环。

为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。

示例 1:

image

输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。

示例 2:
image

输入:head = [1,2], pos = 0
输出:true
解释:链表中有一个环,其尾部连接到第一个节点。

示例 3:
image

输入:head = [1], pos = -1
输出:false
解释:链表中没有环。

solution 1 哈希表

//遍历链表,用hashset对遍历过的进行存储,之后再判断
public class Solution {
    public boolean hasCycle(ListNode head) {
        Set<ListNode> nodeSeen = new HashSet<>();
        while (head != null) {
            if (nodeSeen.contains(head)) {
                return true;
            } else {
                nodeSeen.add(head);
            }
            head = head.next;
        } 
        return false;
    }
}

solution 2 两指针

//整两快慢指针,快的先遇到空,则false;快的等于慢的,则true
public class Solution {
    public boolean hasCycle(ListNode head) {
       if (head == null || head.next == null) {
           return false;
       }
       ListNode slow = head;
       ListNode fast = head.next;
       while (slow != fast) {
           if (fast == null || fast.next == null) {
               return false;
           }
           slow = slow.next;
           fast = fast.next.next;
       }
       return true;
    }
}

142. 环形链表 II

给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。

为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。

说明:不允许修改给定的链表。

示例 1:
image
输入:head = [3,2,0,-4], pos = 1
输出:tail connects to node index 1
解释:链表中有一个环,其尾部连接到第二个节点。

示例 2:
image
输入:head = [1,2], pos = 0
输出:tail connects to node index 0
解释:链表中有一个环,其尾部连接到第一个节点。

示例 3:
image
输入:head = [1], pos = -1
输出:no cycle
解释:链表中没有环。

solution1 哈希表

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

solution2 两指针

//先整两快慢指针找出是否有环
public class Solution {
    public ListNode detectCycle(ListNode head) {
        if (head == null || head.next == null) {
            return null;
        }
        ListNode slow = head;
        ListNode fast = head.next;
        while(slow != fast) {
            if (fast == null || fast.next == null) {
                return null;
            }
            slow = slow.next;
            fast = fast.next.next;
        }
        // 画图、根据数学归纳法可以得出
        ListNode ptr1 = head;
        ListNode ptr2 = slow.next;
        while(ptr1 != ptr2) {
            ptr1 = ptr1.next;
            ptr2 = ptr2.next;
        }
        return ptr1;
        
    }
}
posted @ 2020-05-20 11:16  gg12138  阅读(137)  评论(0)    收藏  举报