LeetCode 142 与 206

本文详细介绍了LeetCode上的两道经典题目:142. 环形链表和206. 反转链表的解题思路与代码实现。对于环形链表,提供了哈希解法和快慢指针解法;对于反转链表,给出了简洁的迭代算法。适合初学者和进阶者深入理解链表操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、 LeetCode 142
1.1 哈希解法
  • 思路1:
    用hash表存储,如果遇到重复的节点,则为环的入口。

  • 代码如下:

class Solution(object):
    def detectCycle(self, head):
        if not head:
            return None
        hash = {head}
        while head.next != None:
            head = head.next
            if head in hash:
                return head
            else:
                hash.add(head)
        return None
1.2 快慢指针解法
  • 思路2:

用快慢指针,快指针每次走两步,慢指针每次走一步。相遇后,慢指针回到起点,快指针走一步,则在环入口相遇。证明如下。

假设快慢指针在环中相遇如下:

  • 假设起点到环入口距离为m
  • 环的长度为n
  • 两指针交点离环入口距离为x

则慢指针总共走了m+x步。
快指针总共走了2m+2x步,减去起点到交点的距离,则快指针在环内共走了m+x步,假设正好走了z圈。即有等式(m+x)/n=z。相遇后将慢指针移到起点,现在快指针在环内走n-x步,慢指针走m步。则满足关系m = (n-x) + (z-1)*n,即慢指针在环内绕z-1圈后与慢指针在环入口相遇。

  • 代码如下:
class Solution(object):
    def detectCycle(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        if not head:
            return None
        p1 = p2 = head
        while True:
            if p2.next is None or p2.next.next is None:
                return None
            p1 = p1.next
            p2 = p2.next.next
            if p1 == p2:
                break
        p1 = head
        while p1 != p2:
            p1 = p1.next
            p2 = p2.next
        return p1
二、 LeetCode 206 反转链表

Reverse a singly linked list.
Example:
Input: 1->2->3->4->5->NULL
Output: 5->4->3->2->1->NULL

  • 思路:
    用head遍历,一个指针p指向head前一个结点,一个指针n指向head后一个结点,当head为空时,返回p结点即可。

  • 代码如下:

class Solution:
    def reverseList(self, head):
        p = None
        n = head
        while head is not None:
            n = n.next
            head.next = p
            p = head
            head = n
        return p
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值