写点什么

算法题学习 --- 删除有序链表中重复的元素 -II

作者:桑榆
  • 2022-11-21
    广东
  • 本文字数:1264 字

    阅读完需:约 4 分钟

题目

描述

给出一个升序排序的链表,删除链表中的所有重复出现的元素,只保留原链表中只出现一次的元素。例如:给出的链表为 1→2→3→3→4→4→5, 返回 1→2→5.给出的链表为 1→1→1→2→3, 返回 2→3.

数据范围:链表长度 0≤n≤10000,链表中的值满足∣val∣≤1000

要求:空间复杂度 O(n),时间复杂度 O(n)

进阶:空间复杂度 O(1),时间复杂度 O(n)

示例 1

输入:{1,2,2}返回值:{1}
复制代码

示例 2

输入:{}返回值:{}
复制代码

分析

分析特殊情况

由题目我们可以知道,当链表为空或者链表只有一个元素时,只需要返回链表头即可。

分析一般情况

首先由于我们不知道是否需要删除头结点,最好新建一个 dummy 节点指向头结点;

然后我们对链表进行遍历,检查前后两个元素是否相等:

  • 如果不等,则往后继续遍历;

  • 如果相等,那么我们需要进行内循环,向后找到所有相等的节点,并删除它们。

这里我们采用了三个节点 pPrePre 初始化为 dummy 节点,pPre 初始化为 head,pCur 初始化为 head->next,然后遍历对比 pPre 与 pCur 的值,如果不等,则更新上面三个指针,如果相等,则先删除 pCur 到最后一个相同值的节点,然后删除 pPre,然后建立新的连接,并更新。

最后返回 pReturn->next.

代码示例

注意,这里也涉及到我们在删除节点时的操作,需要使用一个临时变量缓存需要删除的节点,还有,我们最开始创建的 dummy 节点也不要忘记一并删除。

/** * struct ListNode { *  int val; *  struct ListNode *next; * }; */
class Solution {public: /** * * @param head ListNode类 * @return ListNode类 */ ListNode* deleteDuplicates(ListNode* head) { // write code here if(nullptr == head || nullptr == head->next){ return head; }
ListNode *pReturn = new ListNode(-1); pReturn->next = head; ListNode *pPrePre = pReturn; ListNode *pPre = head; ListNode *pCur = head->next;
while(nullptr != pCur){ if(pPre->val != pCur->val){ pPrePre = pPre; pPre = pCur; pCur = pCur->next; }else{ //delete pCur same value while(nullptr != pCur && pPre->val == pCur->val){ ListNode* pTemp = pCur; pCur = pCur->next; delete pTemp; pPre->next = pCur; } // delete pPre delete pPre; pPre = pCur; pPrePre->next = pPre; if(nullptr == pCur){ break; }else{ pCur = pCur->next; } } } ListNode *pTemp = pReturn; pReturn = pReturn->next; delete pTemp;
return pReturn; }};
复制代码


发布于: 刚刚阅读数: 3
用户头像

桑榆

关注

北海虽赊,扶摇可接;东隅已逝,桑榆非晚! 2020-02-29 加入

Android手机厂商-相机软件系统工程师 爬山/徒步/Coding

评论

发布
暂无评论
算法题学习---删除有序链表中重复的元素-II_算法题_桑榆_InfoQ写作社区