题目:
给定一个链表,判断链表中是否有环。
进阶:
你能否不使用额外空间解决此题?
解题思路:
使用walker与runner策略,定义两个节点,一个是walker节点,一个是runner节点,walker节点每次只走一步,runner节点每次走两步,如果存在环,walker和runner一定会在某个时间点相遇,如果不存在环,runner会优先走到为null的节点。
时间复杂度O(n + k),n为没有环的节点,k为有环所经过的节点,空间复杂度O(1)。
代码实现:
/** * 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 walker = head, runner = head.next; while (runner != null && walker != null) { if (runner.val == walker.val) return true; runner = runner.next; runner = runner == null ? null : runner.next; walker = walker.next; } return false; } }