/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *detectCycle(ListNode *head) {
}
};
面试题 02.08. 环路检测
给定一个链表,如果它是有环链表,实现一个算法返回环路的开头节点
。若环不存在,请返回 null
。
如果链表中有某个节点,可以通过连续跟踪 next
指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos
来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos
是 -1
,则在该链表中没有环。注意:pos
不作为参数进行传递,仅仅是为了标识链表的实际情况。
示例 1:
输入:head = [3,2,0,-4], pos = 1 输出:tail connects to node index 1 解释:链表中有一个环,其尾部连接到第二个节点。
示例 2:
输入:head = [1,2], pos = 0 输出:tail connects to node index 0 解释:链表中有一个环,其尾部连接到第一个节点。
示例 3:
输入:head = [1], pos = -1 输出:no cycle 解释:链表中没有环。
进阶:
原站题解
python3 解法, 执行用时: 48 ms, 内存消耗: 18.9 MB, 提交时间: 2022-11-30 12:58:11
# Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution: def detectCycle(self, head: ListNode) -> ListNode: seen = dict() while head: if head in seen: return head seen[head] = 1 head = head.next return None
python3 解法, 执行用时: 60 ms, 内存消耗: 18.5 MB, 提交时间: 2022-11-30 12:55:36
# Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution: def detectCycle(self, head: ListNode) -> ListNode: slow, fast = head, head while fast: slow = slow.next if fast.next == None: return None fast = fast.next.next if fast == slow: p = head while p != slow: p = p.next slow = slow.next return p return None
golang 解法, 执行用时: 4 ms, 内存消耗: 3.5 MB, 提交时间: 2022-11-30 12:52:27
/** * Definition for singly-linked list. * type ListNode struct { * Val int * Next *ListNode * } */ func detectCycle(head *ListNode) *ListNode { slow, fast := head, head for fast != nil { slow = slow.Next if fast.Next == nil { return nil } fast = fast.Next.Next if fast == slow { p := head for p != slow { p = p.Next slow = slow.Next } return p } } return nil }
javascript 解法, 执行用时: 60 ms, 内存消耗: 43.3 MB, 提交时间: 2022-11-30 12:52:09
/** * Definition for singly-linked list. * function ListNode(val) { * this.val = val; * this.next = null; * } */ /** * @param {ListNode} head * @return {ListNode} */ var detectCycle = function(head) { if (head === null) { return null; } let slow = head, fast = head; while (fast !== null) { slow = slow.next; if (fast.next !== null) { fast = fast.next.next; } else { return null; } if (fast === slow) { let ptr = head; while (ptr !== slow) { ptr = ptr.next; slow = slow.next; } return ptr; } } return null; };
javascript 解法, 执行用时: 80 ms, 内存消耗: 44 MB, 提交时间: 2022-11-30 12:51:51
/** * Definition for singly-linked list. * function ListNode(val) { * this.val = val; * this.next = null; * } */ /** * @param {ListNode} head * @return {ListNode} */ var detectCycle = function(head) { const visited = new Set(); while (head !== null) { if (visited.has(head)) { return head; } visited.add(head); head = head.next; } return null; };
golang 解法, 执行用时: 8 ms, 内存消耗: 4.8 MB, 提交时间: 2022-11-30 12:51:30
/** * Definition for singly-linked list. * type ListNode struct { * Val int * Next *ListNode * } */ func detectCycle(head *ListNode) *ListNode { seen := map[*ListNode]struct{}{} for head != nil { if _, ok := seen[head]; ok { return head } seen[head] = struct{}{} head = head.Next } return nil }