Leetcode 142 Linked List Cycle Ⅱ

编程入门 行业动态 更新时间:2024-10-27 13:22:18

<a href=https://www.elefans.com/category/jswz/34/1769930.html style=Leetcode 142 Linked List Cycle Ⅱ"/>

Leetcode 142 Linked List Cycle Ⅱ

**Leetcode 142 Linked List Cycle Ⅱ

题目描述

Given a linked list, return the node where the cycle begins. If there is no cycle, return null.

To represent a cycle in the given linked list, we use an integer pos which represents the position (0-indexed) in the linked list where tail connects to. If pos is -1, then there is no cycle in the linked list.

Note: Do not modify the linked list.

Example 1:

Input: head = [3,2,0,-4], pos = 1
Output: tail connects to node index 1
Explanation: There is a cycle in the linked list, where tail connects to the second node.

Example 2:

Input: head = [1,2], pos = 0
Output: tail connects to node index 0
Explanation: There is a cycle in the linked list, where tail connects to the first node.

Example 3:

Input: head = [1], pos = -1
Output: no cycle
Explanation: There is no cycle in the linked list.

来源:力扣(LeetCode)
链接:
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路解析

与Leetcode 141 Linked List Cycle思路类似,只不过返回值变成了环的首结点,如果没有环,则返回None

  • 思路一:利用哈希表,代码如下:
# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = Noneclass Solution(object):def detectCycle(self, head):""":type head: ListNode:rtype: ListNode"""if not head or not head.next:return Nonenodes = {}while head:if nodes.get(head):return headelse:nodes[head] = 1head = head.nextreturn None

时间复杂度 O ( N ) O(N) O(N),空间复杂度 O ( N ) O(N) O(N)

  • 思路二:快慢指针

常规的快慢指针只能判断链表是否有环,但是floyd算法,可以根据快指针和慢指针相遇的结点来计算出环的首结点。

参考官方题解,代码如下:

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = Noneclass Solution(object):def detectCycle(self, head):""":type head: ListNode:rtype: ListNode"""start = headif not start or head.next is None:return Noneend = self.intersectNode(head)if end is None:return Nonewhile start != end:start = start.nextend = end.nextreturn start# 求快慢指针相遇结点def intersectNode(self, head):if not head or head.next is None:return Nonelow = head fast = headwhile fast and fast.next:low = low.nextfast = fast.next.nextif low == fast:return lowreturn None

与Leetcode 141 Linked List Cycle不同的是,快慢指针的起始结点不同。

时间复杂度 O ( N ) O(N) O(N),空间复杂度 O ( 1 ) O(1) O(1),待研究floyd

更多推荐

Leetcode 142 Linked List Cycle Ⅱ

本文发布于:2023-07-28 15:43:46,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1239161.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:Leetcode   Linked   Cycle   List

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!