Leetcode 刷题第四天 | 24,19,142

Leetcode 24.两两交换链表中的节点,19.删除链表的倒数第N个结点,142.环形链表

Leetcode 24

题目

给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例 1:
示例1
输入:head = [1,2,3,4]
输出:[2,1,4,3]
示例 2:
输入:head = []
输出:[]
示例 3:
输入:head = [1]
输出:[1]

提示:

  1. 链表中节点的数目在范围 [0, 100] 内
  2. 0 <= Node.val <= 100

代码实现:

链表结构定义:
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next
python 代码:
class Solution:
    def swapPairs(self, head):
        dummpy_head = ListNode(next=head)
        current = dummpy_head
        while current.next != None and current.next.next != None:   # 交换当前节点的后两个元素位置,如果偶数,第一个判断条件;如果是奇数,第二个判断条件;两个条件还不能交换,否则容易导致空指针异常
            pre = current.next  # 保存当前节点的下一个节点
            post = current.next.next.next   # 保存当前被交换位置的两个元素的下一个节点
            
            current.next = current.next.next    # 指针指向
            current.next.next = pre
            pre.next = post
            current = current.next.next
        return dummpy_head.next
复杂度:

时间复杂度: O ( n ) O(n) O(n),因为要循环遍历整个列表
空间复杂度: O ( 1 ) O(1) O(1)

Leetcode 19

题目:

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
示例 1:
示例1
输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
示例 2:
输入:head = [1], n = 1
输出:[]
示例 3:
输入:head = [1,2], n = 1
输出:[1]
提示:
链表中结点的数目为 sz

  1. 1 <= sz <= 30
  2. 0 <= Node.val <= 100
  3. 1 <= n <= sz

代码实现:

链表结构定义:
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next
python 代码实现:
class Solution:
    def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:
        # 问题的关键点在于如何找到倒数第N个节点
        dummy_head = ListNode(next=head)
        fast = slow = dummy_head

        for _ in range(n+1):
            fast = fast.next
        while fast:
            fast = fast.next
            slow = slow.next

        slow.next = slow.next.next
        return dummy_head.next
复杂度:

时间复杂度: O ( n ) O(n) O(n),因为要循环遍历整个列表
空间复杂度: O ( 1 ) O(1) O(1)

Leetcode 142

题目:

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

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。
示例 1:
示例1
输入:head = [3,2,0,-4], pos = 1
输出:返回索引为 1 的链表节点
解释:链表中有一个环,其尾部连接到第二个节点。
示例 2:
示例2
输入:head = [1,2], pos = 0
输出:返回索引为 0 的链表节点
解释:链表中有一个环,其尾部连接到第一个节点。
示例 3:
示例3
输入:head = [1], pos = -1
输出:返回 null
解释:链表中没有环。
提示:

  1. 链表中节点的数目范围在范围 [0, 1 0 4 10^4 104] 内
  2. - 1 0 5 10^5 105 <= Node.val <= 1 0 5 10^5 105
  3. pos 的值为 -1 或者链表中的一个有效索引

进阶:你是否可以使用 O(1) 空间解决此题?

代码实现:

链表结构定义:
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next
python 代码:
        # 这里为什么不适用虚拟头结点:不涉及删除操作之类的,不用虚拟头结点
        fast = head
        slow = head

        while fast != None and fast.next != None:
            fast = fast.next.next
            slow = slow.next

            if fast == slow:
                slow = head

                while fast != slow:
                    fast = fast.next
                    slow = slow.next
                return slow
        return None
复杂度:

时间复杂度: O ( n ) O(n) O(n),因为要循环遍历整个列表
空间复杂度: O ( 1 ) O(1) O(1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值