首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Leetcode No.83 删除排序链表中的重复元素

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

作者头像
week
发布2021-05-06 15:51:20
发布2021-05-06 15:51:20
31700
代码可运行
举报
文章被收录于专栏:用户画像用户画像
运行总次数:0
代码可运行

一、题目描述

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

示例 1: 输入: 1->1->2 输出: 1->2

示例 2: 输入: 1->1->2->3->3 输出: 1->2->3

二、解题思路

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

这里我们定义两个指针变量

1、当前遍历的节点cur​

2、当前遍历的前置节点pre

指定 pre 指针指向头部head

指定 cur 指针指向head->next

cur存在为循环遍历条件,当cur为空时代表链表遍历完毕,循环结束

当 cur.val 和 pre.val 相等时说明需要去重,则将 pre 的下一个指针指向cur的下一个,这样就能达到去重复的效果

如果不相等则pre和cur移动到下一个位置继续循环

三、代码

代码语言:javascript
代码运行次数:0
运行
复制
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        if(head==nullptr){
            return head;
        }
        ListNode* pre=head;
        ListNode* current=head->next;
        while(current!=nullptr){
            if(current->val==pre->val){
                pre->next=current->next;
                delete current;
                current=pre->next;
            }else{
                pre=current;
                current=current->next;
            }
        }
        return head;
    }
};

四、复杂度分析

1、时间复杂度:O(n)

2、空间复杂度:O(1)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/02/15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、题目描述
  • 二、解题思路
  • 三、代码
  • 四、复杂度分析
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档