【Leetcode】【Medium】Remove Duplicates from Sorted List II
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.
解题思路1:
拿到题先思考,别急着写代码。什么样的情况能判定此node不是重复的:
1、node在list第一个,并且和后一个结点值不相等;
2、连续三个结点值都不相等,那么中间那个node就可判定为非重复的;
3、最后一个node如果和倒数第二个结点的值不相等,那么此node也是有效结点。
有了上面的分析,模拟思维的过程,就能得到code1:
(注意新链表添加完成后,要将最后一个结点指向空。)
/**
* 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) {
if (!head || !head->next)
return head;
ListNode *newhead = new ListNode();
ListNode *newlist = newhead;
ListNode* ctrl = head; if (ctrl->val != ctrl->next->val) {
newlist->next = ctrl;
newlist = newlist->next;
} while (ctrl->next) {
if ((ctrl->val != ctrl->next->val) &&
(!ctrl->next->next || ctrl->next->val != ctrl->next->next->val)) {
newlist->next = ctrl->next;
newlist = newlist->next;
}
ctrl = ctrl->next;
} newlist->next = NULL;
return newhead->next;
}
};
解题思路2:
上面的思路相当于每次移动一个结点作为目标结点,然后判断其与左右两边结点的值是否相同;
每次移动一位,判断2次。如果遇到连续多个重复结点,那么效率就会低。
因此,遍历链表结点:
1、先记录第一个结点node_o;
2、找到前后值不一样的结点node1、node2;
3、如果node_o和node1不相同,说明node1不存在重复,那么node1是有效结点;
如果不同,说明node1和前面结点重复,那么重新将node2作为起始结点,继续重复1步骤。
代码:
/**
* 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) {
if (!head || !head->next)
return head;
ListNode *newhead = new ListNode();
ListNode *newlist = newhead;
newlist->next = head;
ListNode* ctrl = head; while (ctrl) {
while (ctrl->next && ctrl->val == ctrl->next->val)
ctrl = ctrl->next; if (newlist->next == ctrl)
newlist = newlist->next;
else
newlist->next = ctrl->next;
ctrl = ctrl->next;
} return newhead->next;
}
};
【Leetcode】【Medium】Remove Duplicates from Sorted List II的更多相关文章
- 82. Remove Duplicates from Sorted List II【Medium】
82. Remove Duplicates from Sorted List II[Medium] Given a sorted linked list, delete all nodes that ...
- 【leetcode】Remove Duplicates from Sorted Array II
Remove Duplicates from Sorted Array II Follow up for "Remove Duplicates":What if duplicate ...
- 【LeetCode练习题】Remove Duplicates from Sorted List II
Remove Duplicates from Sorted List II Given a sorted linked list, delete all nodes that have duplica ...
- 【LeetCode】80. Remove Duplicates from Sorted Array II (2 solutions)
Remove Duplicates from Sorted Array II Follow up for "Remove Duplicates":What if duplicate ...
- [leetcode] 80. Remove Duplicates from Sorted Array II (Medium)
排序数组去重题,保留重复两个次数以内的元素,不申请新的空间. 解法一: 因为已经排好序,所以出现重复的话只能是连续着,所以利用个变量存储出现次数,借此判断. Runtime: 20 ms, faste ...
- LeetCode 80 Remove Duplicates from Sorted Array II [Array/auto] <c++>
LeetCode 80 Remove Duplicates from Sorted Array II [Array/auto] <c++> 给出排序好的一维数组,如果一个元素重复出现的次数 ...
- LeetCode 82. 删除排序链表中的重复元素 II(Remove Duplicates from Sorted List II)
82. 删除排序链表中的重复元素 II 82. Remove Duplicates from Sorted List II 题目描述 给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中没有 ...
- LeetCode之“链表”:Remove Duplicates from Sorted List && Remove Duplicates from Sorted List II
1. Remove Duplicates from Sorted List 题目链接 题目要求: Given a sorted linked list, delete all duplicates s ...
- leetcode 203. Remove Linked List Elements 、83. Remove Duplicates from Sorted List 、82. Remove Duplicates from Sorted List II(剑指offer57 删除链表中重复的结点)
203题是在链表中删除一个固定的值,83题是在链表中删除重复的数值,但要保留一个:82也是删除重复的数值,但重复的都删除,不保留. 比如[1.2.2.3],83题要求的结果是[1.2.3],82题要求 ...
- Leetcode: Remove Duplicates from Sorted List II 解题报告
Remove Duplicates from Sorted List II Given a sorted linked list, delete all nodes that have duplica ...
随机推荐
- redis 网络库文件 重构
https://blog.csdn.net/yangbodong22011/article/details/65444273 相关博客 https://blog.csdn.net/tanswer_/a ...
- TomCat端口被占用问题
TomCat在使用时,有时会爆出端口被占用的问题 解决方法: 1.快捷键win+R,输入cmd,点击回车后再输入netstat -ano|findstr 8005 注:什么端口被占用就输入什么端口号 ...
- unity动态加载FBX模型(Http下载到Rescources文件,场景Load直接调用):
using UnityEngine; using System.Collections; using System.IO; using System.Net; using System; using ...
- Ubuntu下配置安装Hadoop 2.2
---恢复内容开始--- 这两天玩Hadoop,之前在我的Mac上配置了好长时间都没成功的Hadoop环境,今天想在win7 虚拟机下的Ubuntu12.04 64位机下配置, 然后再建一个组群看一看 ...
- Robot Framework_Ride(Edit标签)
前言 RIDE 作为 Robot Framework 的“脸面”,虽然我们已经可以拿它来创建和运行测试了,但我们对它的认识并不全面,这一小节我们将了解这个工具的使用 Edit标签 下面我们来看一看测试 ...
- 使用git配合idea使用oschina代码仓库初级教程
http://git.oschina.net/ 这个是开源中国的代码仓库是免费的,可以建100和仓库,私有也是免费的 第一步,创建 oschina代码仓库,这里就忽略了.很简单.去注册一个简单几步就可 ...
- 【转】“无法从http://XXX/XXX.svc?wsdl获取元数据”错误的解决方法
昨天在用IIS部署一个WCF服务时,碰到了如下错误: 理解了文档内容,但无法进行处理. - WSDL 文档包含无法解析的链接. - 下载“http://admin-pc/IISHostServic ...
- Go语言备忘录(2):反射的原理与使用详解
本文内容是本人对Go语言的反射原理与使用的备忘录,记录了关键的相关知识点,以供翻查. 文中如有错误的地方请大家指出,以免误导!转摘本文也请注明出处:Go语言备忘录(2):反射的原理与使用详解,多谢! ...
- nginx 代理转发 wcf接口
前言 以前对比过enginx和其他几个web服务器(IIS,Apache,lighttpd)的处理静态文件的能力,enginx是最好的,甚至超过其他的几倍. 虽说enginx官方声明在Windows上 ...
- storm之topology的启动
一个topology的启动包括了三个步骤 1)创建TopologyBuilder,设置输入源,输出源 2)获取config 3)提交topology(这里不考虑LocalCluster本地模式) 以s ...