LintCode(M)删除排序链表中的重复数字 II
2016-12-08 17:08
417 查看
删除排序链表中的重复数字 II
描述
笔记
数据
评测
给定一个排序链表,删除所有重复的元素只留下原链表中没有重复的元素。
您在真实的面试中是否遇到过这个题? Yes
样例
给出 1->2->3->3->4->4->5->null,返回 1->2->5->null
给出 1->1->1->2->3->null,返回 2->3->null
标签
相关题目
最初代码版本:
在这里我犯了几个错误:
错误一:
这里并不需要判断
直接改成
之前,我这里还忘了加
错误二:
这里之前忘了加’p->next->next’
另外注意:p=p->next与p->next=p->next->next区别
前者是往后移动一格,后者是删除p->next
正确版本:
描述
笔记
数据
评测
给定一个排序链表,删除所有重复的元素只留下原链表中没有重复的元素。
您在真实的面试中是否遇到过这个题? Yes
样例
给出 1->2->3->3->4->4->5->null,返回 1->2->5->null
给出 1->1->1->2->3->null,返回 2->3->null
标签
相关题目
思路:首先,这是排序链表,而且要求把重复的全删了,而不是留下一个。相同的数是相邻的,但是,不能两两比较,然后这两先删除,再接着两两比较,因为这样,你还要记录之前比较的数的值,所以考虑遍历完这一块相同的数,然后一举删除。
最初代码版本:
/** * Definition of ListNode * class ListNode { * public: * int val; * ListNode *next; * ListNode(int val) { * this->val = val; * this->next = NULL; * } * } */ class Solution{ public: /** * @param head: The first node of linked list. * @return: head node */ ListNode * deleteDuplicates(ListNode *head) { // write your code here if(head==NULL) return NULL; ListNode *pre=new ListNode(-1); pre->next=head; ListNode *p=pre; while(p->next){ ListNode *q=p; while(p->next->next&&p->next->val==p->next->next->val) p=p->next; if(p!=q) { if(p->next->next){q->next=p->next->next;p=q;} else {...这里我删了,忘了} } p=p->next; } return pre->next; } };
在这里我犯了几个错误:
错误一:
if(p->next->next){q->next=p->next->next;p=q;} else {...这里我删了,忘了}
这里并不需要判断
if(p->next->next)
直接改成
q->next=p->next->next;p=q;
之前,我这里还忘了加
p=q;这句
错误二:
while(p->next->next&&p->next->val==p->next->next->val)
这里之前忘了加’p->next->next’
另外注意:p=p->next与p->next=p->next->next区别
前者是往后移动一格,后者是删除p->next
正确版本:
/** * Definition of ListNode * class ListNode { * public: * int val; * ListNode *next; * ListNode(int val) { * this->val = val; * this->next = NULL; * } * } */ class Solution{ public: /** * @param head: The first node of linked list. * @return: head node */ ListNode * deleteDuplicates(ListNode *head) { // write your code here if(head==NULL) return NULL; ListNode *pre=new ListNode(-1); pre->next=head; ListNode *p=pre; while(p->next){ ListNode *q=p; while(q->next->next&&q->next->val==q->next->next->val) q=q->next; if(p!=q) p->next=q->next->next; else p=p->next; } return pre->next; } };
相关文章推荐
- 排队取水
- PowerShell添加或修改注册表开机启动项脚本
- 笔记
- PHP自带方法验证邮箱、URL、IP是否合法的函数
- 两个时间的比较
- Android高级控件(三)—— 使用Google ZXing实现二维码的扫描和生成相关功能体系
- _snscanf_s解析格式字符串
- 基于ffmpeg的音频转码
- &&与&
- java异常之 Could not load net.sf.ehcache.store.disk.DiskStore$KeySet....
- [LeetCode]Sort List
- KMP算法理解
- [egret学习笔记01]显示对象的种类
- LeetCode maximum subarray
- RabbitMQ入门教程——工作队列
- appium新版本不支持findElementByName,切换到findElementByAndroidUIAutomator
- 理解Android多线程里面三种任务Runnable和Callable和FutureTask的用法
- 安装yum
- 网络 运输层(Transport)
- morphia将数据存入mongodb数据库,报错:···morphia.mapping. ···No usable constructor for com.XX.XX.XX