昨天被考了一道数据结构题,当时的实现比較一般。回来翻看leetcode,果然是上面的题。遂解之。

accept之后翻看discuss别人的解法。发现非常多能够accept的代码都过不了我设计的一个case。网上搜了一些别人的代码,也过不了。遂有这篇博客,与君交流

题目是这种:

        Given a sorted linked list, delete all nodes that have duplicate numbers, leaving onlydistinct
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.

当时拿到这个题目,一眼首先想到的就是类似于手游《糖果粉碎传奇》的连续消除的画面。一个比較强的case浮入脑海:

        输入:1->2->3->3->3->5->6->2->2->6->5->2->7

        输出:1->7

分析:当3 和 第一段连续的2 被消除后,链表变成1->2->5->6->6->5->2->7;

                    此时出现了连续的6。遂须要消除6,结果是1->2->5->5->2->7。

                    同理消除5和2之后剩下1->7

可是不管是leetcode里面的discuss还是网上搜到的别人能够accept的代码。都不是上面的这样的输出,得到的输出一般例如以下:

         输出1:1 2 5 6 6 5 2 7

         输出2:1 2 5 5 2 7 

         当然,不知道是题目表意不明,或者是case太弱,可是题目明显写着‘distinct’。当然我觉得我的case应该是对的。遂我来讲一下我的思路和做法。

就拿 1->2->3->3->3->5->6->2->2->6->5->2->7 这个case举例。

在这个题目中。链表是单链表。那么我们用指针遍历链表的时候,是无法回头的,这是个明显的限制条件。可是在这个case中,当删掉3和第一段连续2的之后链表变成1->2->5->6->6->5->2->7。不论你的代码怎么实现,此时你的指针可能在第一个6或者第一个5那里,当链表继续删除连续节点的时候,指针是不得不回头的。否则不可以删除出现的两个5的连续节点。既然这样,题目的解法基本思路可以确定:递归或者栈,当然,两者是想通的。只是栈的实现会方便一些(当时做这个题的时候硬着头皮写递归,没写好,哈哈)。

用堆的方式解题,思路是比較简单的:

1、将头节点放入栈中,设置变量flag=false(flag表示栈顶节点是否须要被删除),检查下个节点

2、假设当前节点是NULL,则跳到第4步;

      假设当前节点跟栈顶节点同样。则跳过链表上这个节点,flag=true,继续运行第2步。

      假设跟栈顶节点值不同。则跳到第3步;

3、假设flag是true,那么把栈顶节点pop掉,flag置false。

      假设flag是false,把当前节点压入栈中,检查下个节点;

      运行第2步;

4、假设flag是true,则pop掉栈顶节点

5、链表的检查到此结束。栈内的节点就是结果链表的逆序存储。又一次组织一下便可

6、注意:栈仅仅须要存节点的指针

复杂度分析:时间复杂度能够简单分析一下,由于每一个节点要么被push要么被丢掉,push也有可能被pop,一共就这三种操作,每种最多运行一次,所以我们能够觉得时间复杂度是O(n)。空间复杂度,最坏情况下会把整个链表的指针都放到栈里面,最好情况下是结果链表的长度,所以空间复杂度是O(n)

最后是我的代码:

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; stack<ListNode *> stk;
bool flag = false;
ListNode * cur = head;
while (cur != NULL) {
if (stk.empty()) {
stk.push(cur);
cur = cur->next;
flag = false;
} else if (cur->val == stk.top()->val) {
flag = true;
// because we don't know how the program frame manage the memory,
// so i didn't free the duplicate ListNode
cur = cur->next;
continue;
} else if (flag) {
stk.pop();
flag = false;
} else {
stk.push(cur);
cur = cur->next;
}
}
if (flag) stk.pop(); // the remaining node in the stack is the result
ListNode * res = NULL;
while(!stk.empty()) {
ListNode* t = stk.top();
stk.pop();
if (res == NULL) {
res = t;
res->next = NULL;
} else {
t->next = res;
res = t;
}
}
return res;
}
};

Remove Duplicates from Sorted List II 解答(有个比較特殊的case leetcode OJ没有覆盖)的更多相关文章

  1. Remove Duplicates from Sorted List II 解答

    Question Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only dist ...

  2. Remove Duplicates from Sorted List II

    Remove Duplicates from Sorted List II Given a sorted linked list, delete all nodes that have duplica ...

  3. 【leetcode】Remove Duplicates from Sorted Array II

    Remove Duplicates from Sorted Array II Follow up for "Remove Duplicates":What if duplicate ...

  4. 50. Remove Duplicates from Sorted Array && Remove Duplicates from Sorted Array II && Remove Element

    Remove Duplicates from Sorted Array Given a sorted array, remove the duplicates in place such that e ...

  5. 48. Remove Duplicates from Sorted List && Remove Duplicates from Sorted List II

    Remove Duplicates from Sorted List Given a sorted linked list, delete all duplicates such that each ...

  6. 【LeetCode练习题】Remove Duplicates from Sorted List II

    Remove Duplicates from Sorted List II Given a sorted linked list, delete all nodes that have duplica ...

  7. Remove Element,Remove Duplicates from Sorted Array,Remove Duplicates from Sorted Array II

    以下三个问题的典型的两个指针处理数组的问题,一个指针用于遍历,一个指针用于指向当前处理到位置 一:Remove Element Given an array and a value, remove a ...

  8. 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 ...

  9. LeetCode 80 Remove Duplicates from Sorted Array II [Array/auto] <c++>

    LeetCode 80 Remove Duplicates from Sorted Array II [Array/auto] <c++> 给出排序好的一维数组,如果一个元素重复出现的次数 ...

随机推荐

  1. 1003. 我要通过!(20) (ZJUPAT 模拟)

    题目链接:http://pat.zju.edu.cn/contests/pat-b-practise/1003 "答案正确"是自己主动判题系统给出的最令人欢喜的回复.本题属于PAT ...

  2. js 获取手机浏览器类型,修改css文件的class的值

    /*========================================= 函数功能:获取浏览器类型 =========================================*/ ...

  3. 0x21 剪枝

    这一章真是心态崩,剪枝太玄学啦,特别是那个搜索顺序我靠真的... poj1011 枚举答案,搜索记录当前到第几根木棒. 剪枝:1.从大到小排序 2.排除等效,这个感觉还行,就是木棒按大小顺序进去,去除 ...

  4. Linux平台Oracle多个实例启动

    如何在Linux系统中启动多个Oracle实例?相信很多Oracle的初学者都会碰到这一类问题,下面我简单介绍一下. 1.切换Oracle用户: # su oracle 2.切换到Oracle目录下: ...

  5. intelliJ idea运行新的test功能时,报错:class not found "....." empty test suite

    转自:https://blog.csdn.net/u012560212/article/details/75037578

  6. 从git源码安装zabbix-agent

    从网上随便找了几个image,都是从svn下载的代码,根本跑不了,于是自己重新做了个,从git上拿的源码,只是build出来的image有点大,有时间再优化了 Dockerfile FROM cent ...

  7. hdu 5372 Segment Game 【 树状数组 】

    给出一些操作, 0是将第i次增加的线段放在b位置,第i次放的线段的长度为i 1是将第b次增加操作放的线段删除 每次增加操作完之后,询问这条线段上面的完整的线段的条数 每次询问统计比这条线段左端点大的线 ...

  8. QA小课堂:一个网站或者APP开发要多少钱

    经常遇到朋友问我:“开发一个京东商城需要多少钱?开发一个滴滴打车需要多少钱?”类似这样的需求,就连我这样一名伪开发者都不愿意去骗客户或者朋友,因为这种问题是很难回答出来的.为什么这么说呢?要知道类似京 ...

  9. easyui的增删改

    陈旧的开发模式PM:“我要这个功能”后端:“这个先找前端做个模板”前端:“模板做完了”后端:“我来对接一下,这里样式不对”前端:“我改完了”后端:“功能交付”PM:“春节要加这个活动”后端:“这个先找 ...

  10. 记录——本地minikube安装ubuntu镜像总是报 Back-off restarting failed container问题 -已解决(更新)

    1.环境介绍 使用本机系统:macX minikube镜像:安装的阿里云提供的镜像(否则总是提示访问google的api,不FQ无法成功) 虚拟机情况:使用Virtual box 的虚拟机环境 min ...