leetcode 83. 删除排序链表中的重复元素 及 82. 删除排序链表中的重复元素 II
83. 删除排序链表中的重复元素
问题描述
给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。
示例 1:
输入: 1->1->2
输出: 1->2
示例 2:
输入: 1->1->2->3->3
输出: 1->2->3
代码(快慢指针法)
* 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 ==NULL)return NULL;
        ListNode* slow=head,*fast=head;
        while(fast)
        {
            if(slow->val != fast->val)
            {
                slow = slow->next;
                slow->val = fast->val;
                fast = fast->next;
            }
            else{
                fast = fast->next;
            }
        }
        slow->next = NULL;
        return head;
    }
};
结果:
执行用时 :12 ms, 在所有 cpp 提交中击败了94.60%的用户
内存消耗 :9.1 MB, 在所有 cpp 提交中击败了65.38%的用户
代码2(便于和下一个问题类比)
/**
 * 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 ==NULL || head->next == NULL)return head;
        ListNode* ans = new ListNode(0),*pre = ans,*cur;
        pre->next = head;
        while(pre->next!= NULL)
        {
            cur = pre->next;
            while(cur->next && cur->val == cur->next->val)cur=cur->next;
            if(cur != pre->next)pre->next = cur;
            else{
                pre = pre->next;
            }
        }
        return ans->next;
    }
};
结果:
执行用时 :8 ms, 在所有 C++ 提交中击败了96.49%的用户
内存消耗 :13.4 MB, 在所有 C++ 提交中击败了5.01%的用户
82. 删除排序链表中的重复元素 II
问题描述
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。
示例 1:
输入: 1->2->3->3->4->4->5
输出: 1->2->5
示例 2:
输入: 1->1->1->2->3
输出: 2->3
代码
/**
 * 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 == NULL || head->next == NULL)return head;
        ListNode* ans = new ListNode(0),*pre = ans,*cur;
        ans->next = head;
        while(pre->next)
        {
           cur = pre->next;
           while(cur->next && cur->val == cur->next->val)cur = cur->next;//去除重复元素
           if(cur != pre->next)pre->next = cur->next;//如果存在重复元素,则指向重复元素下一位
           else pre = pre->next;//不存在重复元素指向目前元素的下一位即可
        }
        return ans->next;
    }
};
结果:
执行用时 :8 ms, 在所有 C++ 提交中击败了88.88%的用户
内存消耗 :13.1 MB, 在所有 C++ 提交中击败了5.01%的用户
leetcode 83. 删除排序链表中的重复元素 及 82. 删除排序链表中的重复元素 II的更多相关文章
- LeetCode 82. 删除排序链表中的重复元素 II(Remove Duplicates from Sorted List II)
		82. 删除排序链表中的重复元素 II 82. Remove Duplicates from Sorted List II 题目描述 给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中没有 ... 
- Java实现 LeetCode 82 删除排序链表中的重复元素 II(二)
		82. 删除排序链表中的重复元素 II 给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字. 示例 1: 输入: 1->2->3->3->4- ... 
- leetcode刷题-82.删除排序链表中的重复元素 II
		题目 给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字. 示例 1: 输入: 1->2->3->3->4->4->5输出: 1- ... 
- LeetCode 82 ——删除排序链表中的重复元素 II
		1. 题目 2. 解答 新建一个链表,并添加一个哨兵结点,从前向后开始遍历链表. 如果下一个结点的值和当前结点的值相等,则循环向后遍历直到找到一个和当前结点值不相等的结点: 反之,如果下一个结点的值和 ... 
- [LeetCode] Insert Delete GetRandom O(1) - Duplicates allowed 常数时间内插入删除和获得随机数 - 允许重复
		Design a data structure that supports all following operations in average O(1) time. Note: Duplicate ... 
- jst通用删除数组中重复的值和删除字符串中重复的字符
		以下内容属于个人原创,转载请注明出处,非常感谢! 删除数组中重复的值或者删除字符串重复的字符,是我们前端开发人员碰到很多这样的场景.还有求职者在被面试时也会碰到这样的问题!比如:问删除字符串重复的字符 ... 
- LeetCode 381. Insert Delete GetRandom O(1) - Duplicates allowed (插入删除和获得随机数 常数时间 允许重复项)
		Design a data structure that supports all following operations in average O(1) time. Note: Duplicate ... 
- javascript 常见数组操作( 1、数组整体元素修改  2、 数组筛选  3、jquery 元素转数组  4、获取两个数组中相同部分或者不同部分  5、数组去重并倒序排序  6、数组排序  7、数组截取slice  8、数组插入、删除splice(需明确位置)  9、数组遍历  10、jQuery根据元素值删除数组元素的方)
		主要内容: 1.数组整体元素修改 2. 数组筛选 3.jquery 元素转数组 4.获取两个数组中相同部分或者不同部分 5.数组去重并倒序排序 6.数组排序 7.数组截取slice 8.数组插入.删除 ... 
- C语言:将带头节点的单向链表结点域中的数据从小到大排序。-求出单向链表结点(不包括头节点)数据域中的最大值。-将M*N的二维数组中的数据,按行依次放入一维数组,
		//函数fun功能是将带头节点的单向链表结点域中的数据从小到大排序. //相当于数组的冒泡排序. #include <stdio.h> #include <stdlib.h> ... 
随机推荐
- CF1106A Lunar New Year and Cross Counting 题解
			Content 试求出在一个 \(n\times n\) 的地图 \(M\) 中,满足 \(1\leqslant i,j\leqslant n\) 且 \(M_{i,j}=M_{i+1,j+1}=M_ ... 
- nginx配置文件简析
			https://blog.csdn.net/wangbin_0729/article/details/82109693 #运行用户 user www-data; #启动进程,通常设置成和cpu的数量相 ... 
- c++设计模式概述之命令
			代码写的不够规范,目的是为了缩短文章篇幅,实际中请不要这样做. 1.概述 命令模式是一种数据驱动的模式.将请求封装到命令的对象中,再传给调用对象,调用对象再处理该命令. [将一个请求封装为一个对象] ... 
- 【LeetCode】986. Interval List Intersections 解题报告(C++)
			作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 双指针 日期 题目地址:https://leetco ... 
- 【LeetCode】140. Word Break II 解题报告(Python & C++)
			作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 递归求解 日期 题目地址:https://leetc ... 
- 【LeetCode】847. Shortest Path Visiting All Nodes 解题报告(Python)
			作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址: https://leetcode.com/problems/shortest ... 
- codeforce-601A. The Two Routes(最短路)
			题意: 给你N个点表示N个站,有汽车和火车,汽车只能走公路,火车只能走铁路. 然后给你M条双向路,代表这两个点之间有铁路连接. 然后告诉你如果两个点之间没有铁路,那么就是公路连接. 问你汽车和火车都到 ... 
- 使用AVPlayer自定义支持全屏的播放器(五)—Swift重构版本
			前言 很早之前开源了一个简单的视频播放器,由于年久失修,效果惨目忍睹,最近特意花时间对其进行了深度重构.旧版本后期不再维护,新版本使用Swift实现,后续会增加更多功能.不想看文字的请自行下载代码-- ... 
- <学习opencv>跨平台和本机windows
			/*=========================================================================*/ // 跨平台和本机Windows /*=== ... 
- Android开发布局 案例二
			实践案例: XML <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:an ... 
