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

简介: 给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。

题目描述


原始题目参考:删除有序链表的重复元素

给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。


示例 1:

af6ef180d06749e690072614c3a7dc63.png

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


示例 2:


940d75c95fa84e5991958eede8f7df23.png

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


解题思路


递归


以示例1为例,链表序列为[1,2,3,3,4,4,5],求该链表的无重复链表可以简化为求[2,3,3,4,4,5]和[1]的拼接,再到求[1,2]和[3,3,4,4,5]的拼接,可以看到[3,3,4,4,5]链表开头有重复,所以去重复数字3的结果链表为[4,4,5],再求其结果为[5],最终的结果为[1,2,5]。


参考代码


ListNode* deleteDuplicates(ListNode* head) {
  if(head==nullptr||head->next==nullptr){
      return head;
  }
  ListNode* last=head->next;
  if(head->val==last->val){
      while(last!=nullptr && head->val==last->val){
          last=last->next;
      }
      head=deleteDuplicates(last);
  }
  else{
      head->next=deleteDuplicates(last);
  }
  return head;
}


指针遍历


需要初始一个临时结点指向head结点,然后再遍历中去除重复的元素,让指针指向未重复过的元素。


还是以示例1为例:

[1,2,3,3,4,4,5],添加头节点变为:[0,1,2,3,3,4,4,5];cur为头节点0,判断1和2是否一样,cur指向1;cur为头节点1,判断2和3是否一样,cur指向2;cur为头节点2,判断3和3是否一样,x为3,进行内层while循环,cur->next从第一个3指向第二个3;判断x和4是否一样,x为3,跳出内层while循环,cur->next指向第一个4;判断4和4是否一样,x为4,进行内层while循环,cur->next从第一个4指向第二个4;判断x和4是否一样,x为4,跳出内层while循环,cur->next指向5;cur指向5,结束程序。


参考代码


ListNode* deleteDuplicates(ListNode* head) {
    if(head==nullptr||head->next==nullptr){
        return head;
    }
    ListNode* temp=new ListNode(0,head);
    ListNode* cur=temp;
    while(cur->next&&cur->next->next){
        if(cur->next->val==cur->next->next->val){
            int x=cur->next->val;
            while(cur->next!=nullptr && x==cur->next->val){
                cur->next=cur->next->next;
            }
        }
        else{
            cur=cur->next;
        }
    }
    return temp->next;
}
目录
相关文章
|
2月前
|
程序员
【刷题记录】移除链表元素
【刷题记录】移除链表元素
|
15天前
01_移除链表元素
01_移除链表元素
|
1天前
【LeetCode 06】203.移除链表元素
【LeetCode 06】203.移除链表元素
9 0
|
2月前
|
存储 算法
LeetCode第83题删除排序链表中的重复元素
文章介绍了LeetCode第83题"删除排序链表中的重复元素"的解法,使用双指针技术在原链表上原地删除重复元素,提供了一种时间和空间效率都较高的解决方案。
LeetCode第83题删除排序链表中的重复元素
|
2月前
|
存储 C语言
【数据结构】c语言链表的创建插入、删除、查询、元素翻倍
【数据结构】c语言链表的创建插入、删除、查询、元素翻倍
【数据结构】c语言链表的创建插入、删除、查询、元素翻倍
|
3月前
【数据结构OJ题】移除链表元素
力扣题目——移除链表元素
35 2
【数据结构OJ题】移除链表元素
|
2月前
|
存储 算法 Java
LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
23 0
|
2月前
|
Python
【Leetcode刷题Python】203.移除链表元素
文章提供了三种删除链表中特定值节点的方法:迭代法、虚拟节点迭代删除法和递归法,并给出了相应的Python实现代码。
17 0
|
4月前
|
存储 SQL 算法
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
|
4月前
|
存储 SQL 算法
LeetCode 题目 86:分隔链表
LeetCode 题目 86:分隔链表