博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Leetcode OJ: Remove Duplicates from Sorted List I/II
阅读量:4568 次
发布时间:2019-06-08

本文共 2601 字,大约阅读时间需要 8 分钟。

对排序数组中重复元素的删除操作,这里分两种情况,一种是重复的元素合并,另一种是重复元素的删除。先从简单的做起:合并

Given a sorted linked list, delete all duplicates such that each element appear only once.

For example,

Given 1->1->2, return 1->2.
Given 1->1->2->3->3, return 1->2->3.

这个就跟数组中重复元素合并差不多,只需要考虑当前节点与下一个节点的关系。

只需要判断当前节点与下一个节点是否相等,不等则把前节点接上目标链表中,这种不等除了值以外,还包括下一个节点为空的情况。

为了操作方便,代码中用到一个虚构的链表头用以辅助操作,代码如下:

1 /** 2  * Definition for singly-linked list. 3  * struct ListNode { 4  *     int val; 5  *     ListNode *next; 6  *     ListNode(int x) : val(x), next(NULL) {} 7  * }; 8  */ 9 class Solution {10 public:11     ListNode *deleteDuplicates(ListNode *head) {12         ListNode vhead(0);13         vhead.next = head;14         ListNode* pre = &vhead;15         ListNode* p = pre->next;16         while (p != NULL) {17             if (p->next == NULL || p->next->val != p->val) {18                 pre->next = p;19                 pre = p;20             }21             p = p->next;22         }23         return vhead.next;24     }25 };

那删除重复元素又有什么区别呢?

Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list.

For example,

Given 1->2->3->3->4->4->5, return 1->2->5.
Given 1->1->1->2->3, return 2->3.

我们需要把重复的删掉。

首先要记录上次删掉的顶点deleted,初始为NULL。

当遇到当前节点与下一节点重复时,我们在跳过前还需要把重复的节点记录到deleted中。

当前节点与下一节点不重复且deleted与当前节点值不重复,那么就把当前节点与目标链表接上。

到最后一个节点时,也作同样判断,不同的是判断到有重复时,需要在目标链表结尾处补上一个NULL。

以上的条件还是需要仔细想想的,LZ表示考虑了很久才化简到个人认为比较容易理解的条件了。看代码:

1 /** 2  * Definition for singly-linked list. 3  * struct ListNode { 4  *     int val; 5  *     ListNode *next; 6  *     ListNode(int x) : val(x), next(NULL) {} 7  * }; 8  */ 9 class Solution {10 public:11     ListNode *deleteDuplicates(ListNode *head) {12         ListNode vhead(0);13         vhead.next = head;14         ListNode* deleted = NULL;15         ListNode* pre = &vhead;16         ListNode* p = pre->next;17         while (p != NULL) {18             if (p->next != NULL) {19                 if (p->val == p->next->val) {20                     deleted = p;21                 } else {22                     if (deleted == NULL || p->val != deleted->val) {23                         pre->next = p;24                         pre = p;25                     } 26                 }27             } else {28                 if (deleted == NULL || p->val != deleted->val) {29                     pre->next = p;30                 } else {31                     pre->next = NULL;32                 }33             }34             p = p->next;35         }36         return vhead.next;37     }38 };

 

 

 

 

转载于:https://www.cnblogs.com/flowerkzj/p/3620057.html

你可能感兴趣的文章
最强蜗牛击败毁灭机器人_黑色幽默才是王道 解读奇葩游戏最强蜗牛
查看>>
初中数学分几个模块_初中数学考试|8大模块,59个必考易错知识点大集合,附初中数学10大专题知识精讲...
查看>>
存储心跳线作用_汽车涂胶线新型吊具输送设备的应用
查看>>
命名时取代基优先顺序_浅谈有机化合物的英文命名(七)
查看>>
开启弹窗_弹窗广告总跳出来?学会这3种方法手机电脑再也不怕被打扰
查看>>
matlab 功率谱密度 汉宁窗_时域和频域特征提取Matlab编程实例
查看>>
centos7 mysql命令_Centos7中mysql安装以及命令
查看>>
mysql8创建不了用户_mysql8创建用户
查看>>
mysql数据库 q_mySQL数据库 - osc_q4xkkmlj的个人空间 - OSCHINA - 中文开源技术交流社区...
查看>>
mysql yum 卸载命令_Linux下MySQL5.7.18 yum方式从卸载到安装
查看>>
mysql use procedure bodies_Debug core file with no symbols
查看>>
debian安vs_如何在Debian 10 Linux上安装和使用Docker
查看>>
jdbc mysql 5.05_JDBC 连接 MySQL 时碰到的小坑
查看>>
rancher部署mysql怎么挂在卷轴_Rancher部署mysql8
查看>>
java_home没有定义_“错误:JAVA_HOME没有正确定义.”在构建Jikes rvm
查看>>
python canvas画移动物体_tkinter – 用于画布对象python的动画移动的方法
查看>>
java 连接 rac_JAVA 连接 ORACLE RAC 字符串
查看>>
java面试题 网络编程_java面试题《三、网络编程》
查看>>
java布尔矩阵程序_Java编程学习摘要(2)语法基础
查看>>
java no wait_即使队列在activemq中不为空,JMS实现中的receiveNoWait也返回null
查看>>