首页 > 其他分享 >83. 删除排序链表中的重复元素 线性法&快慢双指针

83. 删除排序链表中的重复元素 线性法&快慢双指针

时间:2024-10-18 17:20:01浏览次数:11  
标签:head slow cur fast next 链表 83 指针

83. 删除排序链表中的重复元素

给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。

示例 1:

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

示例 2:

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

提示:

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

线性法

10min

常规

    public ListNode deleteDuplicates(ListNode head) {
        if (head == null || head.next == null) return head;
        ListNode cur = head;
        while(cur.next != null){
            if(cur.val != cur.next.val){
                cur = cur.next;
            }else{
                cur.next = cur.next.next;
            }
        }
         return head;
    }

快慢双指针

20min

区分 链表.next = 链表  和 链表 = 链表.next  第一种方法会改变链表结构 第二种方法则不会 只是移动到下一个节点  slow只改变链表  fast探路。

只要fast找到和当前相同的节点值则继续迭代,如果不同则连接到链表

    public ListNode deleteDuplicates(ListNode head) {
        //1.剪枝 2.定义快慢指针 快指针先行探路 慢指针维护吴重复节点
        if(head == null || head.next == null) return head;
        ListNode slow = head;
        ListNode fast = head.next;
        //这里一定要当前!=null  用fast.next会无法遍历到最后一个节点
        while(fast != null){
        //如果fast发现了与当前slow的值不一样的节点就跟自己连接,说白了slow所有的元素都是不重复的,fast只是探路的
            if(slow.val != fast.val){
                slow.next = fast;
                slow = slow.next;
            }else{
                fast = fast.next;
            }
        }
        //在遍历结束后,slow 指针可能仍然指向最后一个唯一的节点,但它的 next 可能依然指向一个重复节点(如果链表以重复节点结束)。
        slow.next = null;
        return head;    
    }

标签:head,slow,cur,fast,next,链表,83,指针
From: https://blog.csdn.net/m0_63920681/article/details/143058541

相关文章

  • C++ 基础-面试题02(final和override关键字、sizeof和strlen区别、strcpy、sprintf 与me
    1.final和override关键字在C++中,final和override关键字是在面向对象编程中用于处理类的继承和多态的。它们主要用于管理派生类和虚函数,提供额外的安全性和代码可读性,防止意外的函数重写或错误的重载行为。1.final关键字final关键字用于防止进一步的继承或函数重......
  • 109. 有序链表转换二叉搜索树【二叉树】
    文章目录109.有序链表转换二叉搜索树解题思路Go代码109.有序链表转换二叉搜索树109.有序链表转换二叉搜索树给定一个单链表的头节点head,其中的元素按升序排序,将其转换为平衡二叉搜索树。平衡二叉树是指该树所有节点的左右子树的深度相差不超过1。示例......
  • 力扣面试题02.07.链表相交
    题目链接:面试题02.07.链表相交-力扣(LeetCode)给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。图示两个链表在节点 c1 开始相交:题目数据 保证 整个链式结构中不存在环。注意,函数返回结果......
  • 力扣142.环形链表II
    题目链接:142.环形链表II-力扣(LeetCode)给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数 pos 来表示......
  • 一.函数指针的创建 二.函数指针的使用
    一变量有地址,数组也有地址那么函数是否有地址呢?我们可以来试一下 我们可以看到函数有地址 之前我们知道对数组取地址是个地址,数组名拿到的也是个地址那对于函数来说呢?是不是也存在函数名和取地址函数名两个地址呢?我们可以通过代码来验证一下  那么这俩地址代表的有......
  • 【数据结构】之链表详解
    链表是一种常用的数据结构,它是一种线性数据结构,但与数组不同,它并非连续存储数据,而是通过指针将数据节点连接起来。每个节点都包含数据域和指向下一个节点的指针域。这种结构赋予链表独特的优势和局限性,使其在某些场景下优于数组,在另一些场景下则相对逊色。本文将深入探讨链表,包......
  • LeetCode:809.情感丰富的文字(双指针 Java)
    目录809.情感丰富的文字题目描述:实现代码与解析:双指针原理思路:809.情感丰富的文字题目描述:        有时候人们会用重复写一些字母来表示额外的感受,比如 "hello"->"heeellooo", "hi"->"hiii"。我们将相邻字母都相同的一串字符定义为相同字母组,例如:"h",......
  • 1283 回文日期 枚举 模拟 时间
    #include<bits/stdc++.h>#definelllonglongusingnamespacestd;constintN=1e3+10;//每个月的天数,2月暂时设为29天,后续会根据闰年和平年调整inta[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};intmain(){ints1,s2,ans=0;cin>>......
  • Oracle 19c OCP 认证考试 083 题库(第3题)- 2024年修正版
    【优技教育】Oracle19cOCP083题库(Q3题)-2024年修正版考试科目:1Z0-083考试题量:85道(线下)通过分数:57%以上考试时间:150min(线下)本文为(CUUG原创)整理并解析,转发请注明出处,禁止抄袭及未经注明出处的转载。原文地址:http://www.cuug.com.cn/ocp/083kaoshitiku/38540354314.ht......
  • 翻转链表常用写法
    翻转链表常用写法循环写法classSolution{public:ListNode*reverseList(ListNode*head){ListNode*prev=nullptr,*next=nullptr,*now=head;while(now){next=now->next;now->next=prev;prev=......