【python】Leetcode每日一题-删除排序链表中的重复元素2

【题目描述】

存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字。

返回同样按升序排列的结果链表。

示例1:

输入:head = [1,2,3,3,4,4,5]
输出:[1,2,5]

示例2:

输入:head = [1,1,1,2,3]
输出:[2,3]

提示:

链表中节点数目在范围 [0, 300] 内
-100 <= Node.val <= 100
题目数据保证链表已经按升序排列

【分析】

  • 思路:

    利用栈+标记,遍历一遍链表节点,如果栈中无此节点值,将值压入栈,并给予初始标记0,如果有此节点值,则表示已存在,不将节点压入栈中,并标记对应栈中值的标记为1

    最后遍历一遍栈,如果对应标记为0则添加新链表的节点。

  • 单调栈

    # Definition for singly-linked list.
    # class ListNode:
    # def __init__(self, val=0, next=None):
    # self.val = val
    # self.next = next class Solution:
    def deleteDuplicates(self, head: ListNode) -> ListNode:
    all = []
    flag = []
    while head != None:
    if head.val not in all:
    all.append(head.val)
    flag.append(0)
    else:
    index = all.index(head.val)
    flag[index] = 1
    head = head.next
    p = ListNode()
    head = p
    k = p
    flag_ = False
    for i in range(len(all)):
    if flag[i] == 0:
    flag_ = True
    p.val = all[i]
    q = ListNode()
    p.next = q
    k = p
    p = q
    if flag_:
    k.next = None
    else:
    head = None
    return head
  • 看了一位兄弟的评论,感觉比官方的全:

    • hash_map

      其实就是标记,但是这样的话时间复杂度和空间复杂度都低很多。

      /**
      * Definition for singly-linked list.
      * struct ListNode {
      * int val;
      * ListNode *next;
      * ListNode(int x) : val(x), next(NULL) {}
      * };
      */
      class Solution {
      public:
      ListNode* deleteDuplicates(ListNode* head) {
      if (!head || !head->next)
      return head; unordered_map<int, int> mp;
      ListNode* cur = head;
      while (cur) {
      mp[cur->val]++;
      cur = cur->next;
      } cur = head;
      ListNode* dummy = new ListNode(-1);
      ListNode* res = dummy;
      while (cur) {
      if (mp[cur->val] == 1) {
      dummy->next = new ListNode(cur->val);
      dummy = dummy->next;
      }
      cur = cur->next;
      }
      return res->next;
      }
      };
    • 哑头节点

      即官方解法(自己忽略了递增序列,麻烦了很多

      /**
      * Definition for singly-linked list.
      * struct ListNode {
      * int val;
      * ListNode *next;
      * ListNode(int x) : val(x), next(NULL) {}
      * };
      */
      class Solution {
      public:
      ListNode* deleteDuplicates(ListNode* head) {
      if (!head || !head->next)
      return head; ListNode* dummy = new ListNode(-1);
      dummy->next = head; ListNode* pre = dummy;
      ListNode* cur = head;
      while (cur && cur->next) {
      if (cur->val == cur->next->val) {
      while (cur->next && cur->val == cur->next->val) {
      cur = cur->next;
      }
      pre->next = cur->next;
      cur = cur->next;
      } else {
      pre = cur;
      cur = cur->next;
      }
      }
      return dummy->next;
      }
      };
    • 递归

      思路和dummy头节点一样,只是实现思路不同

      值不同时递归,值相同时pass

      /**
      * Definition for singly-linked list.
      * struct ListNode {
      * int val;
      * ListNode *next;
      * ListNode(int x) : val(x), next(NULL) {}
      * };
      */
      class Solution {
      public:
      ListNode* deleteDuplicates(ListNode* head) {
      if (!head)
      return head; if (head->next && head->val == head->next->val) {
      while (head->next && head->val == head->next->val) {
      head = head->next;
      }
      return deleteDuplicates(head->next);
      } else {
      head->next = deleteDuplicates(head->next);
      } return head;
      }
      };

【python】Leetcode每日一题-删除排序链表中的重复元素2的更多相关文章

  1. 【python】Leetcode每日一题-删除排序链表中的重复元素

    [python]Leetcode每日一题-删除排序链表中的重复元素 [题目描述] 存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除所有重复的元素,使每个元素 只出现一次 . 返回同 ...

  2. Leetcode(82)-删除排序链表中的重复元素 II

    给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字. 示例 1: 输入: 1->2->3->3->4->4->5 输出: 1-&g ...

  3. 【leetcode 简单】第十九题 删除排序链表中的重复元素

    给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次. 示例 1: 输入: 1->1->2 输出: 1->2 示例 2: 输入: 1->1->2->3-&g ...

  4. Leetcode(83)-删除排序链表中的重复元素

    给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次. 示例 1: 输入: 1->1->2 输出: 1->2 示例 2: 输入: 1->1->2->3-&g ...

  5. 【python】Leetcode每日一题-删除有序数组中的重复项

    [python]Leetcode每日一题-删除有序数组中的重复项 [题目描述] 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 最多出现一次 ,返回删除后数组的新长度. 不要 ...

  6. 【python】Leetcode每日一题-删除有序数组中的重复项2

    [python]Leetcode每日一题-删除有序数组中的重复项2 [题目描述] 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 最多出现两次 ,返回删除后数组的新长度. 不 ...

  7. Leecode刷题之旅-C语言/python-83删除排序链表中的重复元素

    /* * @lc app=leetcode.cn id=83 lang=c * * [83] 删除排序链表中的重复元素 * * https://leetcode-cn.com/problems/rem ...

  8. 力扣(LeetCode)删除排序链表中的重复元素II 个人题解

    给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字. 思路和上一题类似(参考 力扣(LeetCode)删除排序链表中的重复元素 个人题解)) 只不过这里需要用到一个前 ...

  9. LeetCode:删除排序链表中的重复元素【83】

    LeetCode:删除排序链表中的重复元素[83] 题目描述 给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次. 示例 1: 输入: 1->1->2 输出: 1->2 示 ...

随机推荐

  1. 基于Linux的tty架构及UART驱动详解

    更多嵌入式Linux原创,请关注公众号:一口Linux 一.模块硬件学习 1.1. Uart介绍 通用异步收发传输器(Universal Asynchronous Receiver/Transmitt ...

  2. c++ 11 是如何简化你的数据库访问接口的

    之前写过一篇文章专门分析了 c++ 模板编译过程中报的一个错误:<fatal error C1045: 编译器限制 : 链接规范嵌套太深 >,其中涉及到了 qtl -- 一个使用 c++ ...

  3. hive学习笔记之一:基本数据类型

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  4. 翻译:《实用的Python编程》05_01_Dicts_revisited

    目录 | 上一节 (4.4 异常) | 下一节 (5.2 封装) 5.1 再谈字典 Python 对象系统主要基于字典实现.本节将对此进行讨论. 字典 字典是命名值(named values)的集合. ...

  5. 对话对话每日互动CEO方毅:数据智能应用的过去、现在和未来每日互动CEO方毅:数据智能应用的过去、现在和未来

    2008年,大数据的概念被首次提出,麦肯锡全球研究所给出的定义是:大数据是在一种获取.存储.管理.分析方面大大超出了传统数据库软件工具能力范围的数据集合. 2014年,"数据智能" ...

  6. 【odoo14】第十三章、网站开发(对外服务)

    本章我们将介绍一些关于odoo web服务方面的基础知识.进阶的内容,将在第十四章介绍. odoo中的web请求是由python的werkzeug库驱动的.odoo为了操作方便,对werkzeug进行 ...

  7. FTT简单入门板子

    DFT : 1 #include <cstdio> 2 #include <iostream> 3 #include <cmath> 4 #include < ...

  8. OpenGL光照计算中法线矩阵原理及推到过程

    问题起源 在计算漫反射关照时,需要用到法线,通过法线和光线的点乘值,计算漫反射的产生的光线强度,所以需要从顶点着色器中将法线数据传递到片源着色器中,但是片源着色器中的顶点坐标是经过了模型矩阵变化过的世 ...

  9. springBoot高级:自动配置分析,事件监听,启动流程分析,监控,部署

    知识点梳理 课堂讲义 02-SpringBoot自动配置-@Conditional使用 Condition是Spring4.0后引入的条件化配置接口,通过实现Condition接口可以完成有条件的加载 ...

  10. 「HTML+CSS」--自定义按钮样式【002】

    前言 Hello!小伙伴! 首先非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出- 哈哈 自我介绍一下 昵称:海轰 标签:程序猿一只|C++选手|学生 简介:因C语言结识编程,随后转入计算机 ...