每天一道LeetCode-----移除有序链表中的重复节点
来源:互联网 发布:淘宝内部优惠券群号 编辑:程序博客网 时间:2024/05/01 01:23
Remove Duplicates from Sorted List
原题链接Remove Duplicates from Sorted List
给定一个有序链表,对于链表中所有重复元素,只保留一个,其余的都删掉
因为链表是有序的,而且所有重复节点中只需要保留一个,所以假设上一个找到的节点是prev,当前找到的节点是cur,那么只需要判断cur->val和prev->val是否相等,即可判断要不要将cur添加到结果链表中
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNode* deleteDuplicates(ListNode* head) { ListNode* prev = head; ListNode* cur = head->next; while(cur) { if(cur->val != prev->val) { prev->next = cur; prev = cur; } cur = cur->next; } return head; }};
另一种方法,可以考虑
因为链表是有序的,相同的元素都集中在一起,所以只需要保留
- 下一个节点是null的节点
- 不重复的节点
- 重复节点的最后一个节点
假设当前节点为cur
判断下一个节点是否是null的方法为
if(!cur->next)
判断当前节点不是重复节点或者是重复节点的最后一个节点的方法为
if(cur->val != cur->next->val)
代码如下
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNode* deleteDuplicates(ListNode* head) { ListNode* header = new ListNode(-1); header->next = head; ListNode* cur = head; ListNode* prev = header; while(cur) { /* 最后一个节点或相同节点的最后一个 */ if(!cur->next || cur->val != cur->next->val) { prev->next = cur; prev = cur; } cur = cur->next; } head = header->next; delete header; return head; }};
Remove Duplicates from Sorted List II
原题链接Remove Duplicates from Sorted List II
仍然是去掉重复节点,但是重复节点一个都不保留
在上面的情况中,需要保留重复节点的最后一个节点,但是这里不需要保留,根据上面的解释
if(cur->val != cur->next->val)
可以判断当前节点不是重复节点或者是重复节点的最后一个节点,所以为了抛出第二种情况,在进入条件后仍然需要再次判断
可以通过一个变量记录当前节点是否是重复节点的最后一个节点,方法是如果
if(cur->val == cur->next->val)
那么cur->next可能就是重复节点的最后一个节点,只需要在前一次记录即可
代码如下
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNode* deleteDuplicates(ListNode* head) { ListNode* header = new ListNode(-1); header->next = head; ListNode* cur = head; ListNode* prev = header; bool duplicate = false; while(cur) { if(!cur->next || cur->val != cur->next->val) { /* duplicate为false表示当前节点不是重复节点 */ if(duplicate == false) { prev->next = cur; prev = cur; } else { duplicate = false; } } else { /* 令duplicate为true表示当前节点是重复节点 */ duplicate = true; } cur = cur->next; } prev->next = nullptr; head = header->next; delete header; return head; }};
这两道题主要需要解决的是如何判断重复节点,如果需要保留一个重复节点,那么每次遇到一个新节点就添加到结果中。如果不需要保留重复节点,那么就需要增加一层判断条件,可以记录这个节点是否是重复节点
阅读全文
0 0
- 每天一道LeetCode-----移除有序链表中的重复节点
- 删除有序链表中的重复节点
- 删除有序链表中的重复节点
- 每天一道LeetCode-----从有序数组中删除重复元素
- 移除有序数组中的重复数字
- 移除有序数组中的重复元素
- leetcode 4. 移除有序数组中的重复元素 Remove Duplicates from Sorted Array
- 删除有序链表中的重复节点2
- 每天一道LeetCode-----合并两个/多个有序链表为一个新链表
- CCI 2.1 移除未排序链表中的重复节点
- 移除未排序链表中的重复节点算法实现
- 移除有序数组中的重复数字2
- leetcode 删除有序链表中的重复元素
- 每天一道LeetCode-----删除链表倒数第n个节点
- 程序员面试金典2.1:编写代码,移除未排序的链表中的重复节点
- 每天一道LeetCode-----回文链表
- 每天一道LeetCode-----逆序链表
- 每天一道LeetCode-----有序数组右移n位后查找某个元素
- Aras innovator: innovator大家族
- CentOS7——supervisor安装配置实战
- Android Editext 点击两次后软键盘遮挡 Editext控件的问题
- 用GAN还原语义标注图!还能手动改细节(附论文、代码)
- JAVA集合框架之AbstractCollection抽象类和AbstractList抽象类
- 每天一道LeetCode-----移除有序链表中的重复节点
- 628. Maximum Product of Three Numbers数组中三个数乘积最大
- 组合数学笔记C8
- RTC_WakeUp中断唤醒STM32F4停止模式
- CSS书写规范与理论
- HDU 1241 Oil Deposits 深搜(DFS)
- Failed to parse mapping resource......
- react-native调起第三方高德地图导航URL解释
- 关于IDEA 创建WebService实例访问404问题的解决