• LeetCode:链表(二)


    本组囊括链表相关题目,难度不等。

    24. Swap Nodes in Pairs

    题目描述:中等

    解法一:

    考虑迭代解法,如果要两两交换相邻的节点,则这些节点肯定是相邻的奇偶节点,使用两个指针来遍历所有的奇偶节点。交换后将新节点的头指向第二个的头即可;
    除了一个哨兵外,还需要定义一个指针current来更新链表,这个指针指向头节点;

     1 class Solution:
     2     def swapPairs(self, head: ListNode) -> ListNode:
     3         dummy = ListNode(0)
     4         dummy.next = head 
     5         current = dummy
     6         while head and head.next:
     7             # 定位到需要交换的节点
     8             firstNode = head
     9             secondNode = head.next
    10 
    11             # 开始交换并更新头节点
    12             current.next = secondNode
    13             firstNode.next = secondNode.next
    14             secondNode.next = firstNode
    15 
    16             # 重新初始化head和curernt.next
    17             current = firstNode
    18             head = firstNode.next
    19 
    20         return dummy.next
    21         # 时间复杂度: O(n)
    22         # 空间复杂度: O(1)

    83. Remove Duplicates from Sorted List

    题目描述:简单

    解法一:

    这道题测试操作列表的结点指针的能力。由于输入的列表已排序,因此我们可以通过将结点的值与它之后的结点进行比较来确定它是否为重复结点。如果它是重复的,我们更改当前结点的 next 指针,以便它跳过下一个结点并直接指向下一个结点之后的结点。

     1 class Solution:
     2     def deleteDuplicates(self, head: ListNode) -> ListNode:
     3         # 迭代,遍历
     4         dummy = ListNode(0)
     5         dummy.next = head # 哑节点
     6         while head and head.next:
     7             if head.next.val == head.val:  # 如果全部都是重复的,那么最后第一个节点的next会指向None,即最后返回只会返回第一个指针。
     8                 head.next = head.next.next
     9             else:
    10                 head = head.next
    11         return dummy.next
    12         # 时间复杂度: O(n)
    13         # 空间复杂度: O(1)

     

    82. Remove Duplicates from Sorted List II

    题目描述:中等

    解法一:

    上一题是这道题的简版,只用删除重复的其他就行,这道题是需要删除所有重复的只保留没有重复出现的数字;
    上一题做法是重复的话当前指针就指向下下个节点,这题的逻辑应该是如果重复的话当前节点的上一节点指针指向下下个节点,于是我们能想到的就是再多定义一个指针,用两个指针不断往前移动求解;
    这里需要注意的是逻辑为两个指针指向下一个节点的值是否相等。

     1 class Solution:
     2     def deleteDuplicates(self, head: ListNode) -> ListNode:
     3         dummy = ListNode(0) # 哨兵节点
     4         dummy.next = head
     5         a = dummy
     6         b = head
     7         while b and b.next:
     8             if a.next.val != b.next.val:
     9                 a = a.next
    10                 b = b.next
    11             else:
    12                 while b and b.next and a.next.val == b.next.val: # 若相等,则单独移动b指针,直到两个指针指向的下一个值不等。再移动b指针,让a指针指向b。
    13                     b = b.next
    14                 a.next = b.next
    15                 b = b.next # 相对位置,b也移动
    16         return dummy.next
    17         # 时间复杂度: O(n)
    18         # 空间复杂度: O(1)
  • 相关阅读:
    C++new失败的处理
    [转]va_start和va_end使用详解
    zookeeper的一些异常总结
    无法产生coredump的问题
    [译]AMQP 0-9-1 Quick Reference : basic
    阿里巴巴分布式数据库同步系统(解决中美异地机房)
    第一步(搭建阿里云主机服务器): 如何在远程Linux服务器上搭建Nginx
    iOS响应事件传递, nextResponder研究
    五个在Safari浏览器上的实用快捷键使用
    git three
  • 原文地址:https://www.cnblogs.com/Jesee/p/13952485.html
Copyright © 2020-2023  润新知