LeetCode - 083 - 删除排序链表中的重复元素(remove-duplicates-from-sorted-list

栏目: IT技术 · 发布时间: 5年前

内容简介:LeetCode - 083 - 删除排序链表中的重复元素(remove-duplicates-from-sorted-list

Create by jsliang on 2019-6-12 08:50:11
Recently revised in 2019-6-18 09:26:06

一 目录

不折腾的前端,和咸鱼有什么区别

| 目录 | | --- | | 一 目录 | | 二 前言 | | 三 解题代码 | | 四 执行测试 | | 五 LeetCode Submit | | 六 解题思路 | | 七 总结 |

二 前言

  • 难度:简单

  • 涉及知识:链表

  • 题目地址:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list/

  • 题目内容

  1. 给定一个 排序 链表,删除所有重复的元素,使得每个元素只出现一次。

  2. 示例 1:

  3. 输入: 1->1->2

  4. 输出: 1->2

  5. 示例 2:

  6. 输入: 1->1->2->3->3

  7. 输出: 1->2->3

三 解题代码

小伙伴可以先自己在本地尝试解题,再回来看看 jsliang 的解题思路。

  1. var deleteDuplicates = function(head) {

  2. if (!head) { // 预防 [] 情况

  3. return head;

  4. }

  5. let removal = {

  6. val: -99, // 预防 [-1, 1, 1, 1, 3] 情况

  7. next: null,

  8. };

  9. let follower = removal;

  10. while (head) {

  11. if (head.val != follower.val) {

  12. follower.next = head;

  13. head = head.next;

  14. follower = follower.next;

  15. } else {

  16. if (head.next === null) { // 预防 [1, 1, 2, 3, 3] 情况

  17. follower.next = null;

  18. }

  19. head = head.next;

  20. }

  21. }

  22. return removal.next;

  23. };

四 执行测试

  • 参数: head

  1. let head = {

  2. val: 1,

  3. next: {

  4. val: 1,

  5. next: {

  6. val: 2,

  7. next: {

  8. val: 3,

  9. next: {

  10. val: 3,

  11. next: null

  12. }

  13. },

  14. }

  15. }

  16. }

  • 返回值: return

  1. { val: 1, next: { val: 2, next: { val: 3, next: null } } }

五 LeetCode Submit

  1. Accepted

  2. 165/165 cases passed (100 ms)

  3. Your runtime beats 90.76 % of javascript submissions

  4. Your memory usage beats 13.09 % of javascript submissions (36.3 MB)

六 解题思路

首先,这道题不是第一次碰到链表,小伙伴可以查看 021-合并两个有序链表(merge-two-sorted-lists),先了解一波链表的有关知识。

然后,在这道题中,我们的解题思路就可以迎刃而解了:

  • 步骤 1:在代码中添加 console.log(),查看代码执行机制。

  1. var deleteDuplicates = function(head) {

  2. if (!head) { // 预防 [] 情况

  3. return head;

  4. }

  5. let removal = {

  6. val: -99, // 预防 [-1, 1, 1, 1, 3] 情况

  7. next: null,

  8. };

  9. let follower = removal;

  10. while (head) {

  11. console.log('------');

  12. console.log(head);

  13. console.log(removal);

  14. console.log(follower);

  15. if (head.val != follower.val) {

  16. follower.next = head;

  17. head = head.next;

  18. follower = follower.next;

  19. } else {

  20. if (head.next === null) { // 预防 [1, 1, 2, 3, 3] 情况

  21. follower.next = null;

  22. }

  23. head = head.next;

  24. }

  25. }

  26. return removal.next;

  27. };

  28. let head = { // 即 [1, 1, 2, 3, 3]

  29. val: 1,

  30. next: {

  31. val: 1,

  32. next: {

  33. val: 2,

  34. next: {

  35. val: 3,

  36. next: {

  37. val: 3,

  38. next: null

  39. }

  40. },

  41. }

  42. }

  43. }

  44. deleteDuplicates(head);

  • 步骤 2:执行代码,得到打印信息,顺序 head -> removal -> follower

  1. jsliang 注释:

  2. 第一次遍历,

  3. 我们的 headremovalfollower 都处于初始状态

  4. ------

  5. { val: 1, next: { val: 1, next: { val: 2, next: { val: 3, next: { val: 3, next: null } } } } }

  6. { val: -99, next: null }

  7. { val: -99, next: null }

  8. jsliang 注释:

  9. 第二次遍历,

  10. 我们的 head = head.nextfollower = head.next

  11. 这样 removal 就获得了 1,以及之后的整个 next

  12. ------

  13. { val: 1, next: { val: 2, next: { val: 3, next: { val: 3, next: null } } } }

  14. { val: -99, next: { val: 1, next: { val: 1, next: { val: 2, next: { val: 3, next: { val: 3, next: null } } } } } }

  15. { val: 1, next: { val: 1, next: { val: 2, next: { val: 3, next: { val: 3, next: null } } } } }

  16. jsliang 注释:

  17. 第三次遍历,

  18. 我们的 head 继续前进一步:head = head.next

  19. 但是因为 head.val == follower.val

  20. 所以我们这次不修改 follower,从而做到去重的作用。

  21. follower 的变动影响 removal 的变动)

  22. ------

  23. { val: 2, next: { val: 3, next: { val: 3, next: null } } }

  24. { val: -99, next: { val: 1, next: { val: 1, next: { val: 2, next: { val: 3, next: { val: 3, next: null } } } } } }

  25. { val: 1, next: { val: 1, next: { val: 2, next: { val: 3, next: { val: 3, next: null } } } } }

  26. jsliang 注释:

  27. 第四次遍历,

  28. 我们的 head 继续前进一步:head = head.next

  29. 然后 follower removal 获得了 head.next

  30. ------

  31. { val: 3, next: { val: 3, next: null } }

  32. { val: -99, next: { val: 1, next: { val: 2, next: { val: 3, next: { val: 3, next: null } } } } }

  33. { val: 2, next: { val: 3, next: { val: 3, next: null } } }

  34. jsliang 注释:

  35. 第五次遍历,

  36. 我们的 head 继续前进一步:head = head.next

  37. 此时 head.val == follower.val

  38. 并且 head.next == null

  39. 所以我们直接将 follower.next 设置为 null

  40. 从而获得最终结果

  41. ------

  42. { val: 3, next: null }

  43. { val: -99, next: { val: 1, next: { val: 2, next: { val: 3, next: { val: 3, next: null } } } } }

  44. { val: 3, next: { val: 3, next: null } }

  45. jsliang 注释:

  46. 最终 return 的值如下所示:

  47. ------

  48. { val: 1, next: { val: 2, next: { val: 3, next: null } } }

最后,小伙伴们如果还不理解,可以自行拷贝代码到本地,或者看多两遍代码,如有不懂,记得留言。

七 总结

这样,我们就搞定了 LeetCode 简单难度的第二个链表题目,想来也就那么回事,小伙伴们学会了吗~


不折腾的前端,和咸鱼有什么区别!

LeetCode - 083 - 删除排序链表中的重复元素(remove-duplicates-from-sorted-list

jsliang 会每天在公众号发表一篇文章,从而帮助小伙伴们夯实原生 JS 基础,了解与学习算法与数据结构等等。

扫描上方二维码,关注 jsliang 的公众号,让我们一起折腾!

LeetCode - 083 - 删除排序链表中的重复元素(remove-duplicates-from-sorted-list
jsliang 的文档库 由 梁峻荣 采用 知识共享 署名-非商业性使用-相同方式共享 4.0 国际 许可协议进行许可。
基于https://github.com/LiangJunrong/document-library上的作品创作。
本许可协议授权之外的使用权限可以从 https://creativecommons.org/licenses/by-nc-sa/2.5/cn/ 处获得。



以上所述就是小编给大家介绍的《LeetCode - 083 - 删除排序链表中的重复元素(remove-duplicates-from-sorted-list》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

共享经济大趋势

共享经济大趋势

倪云华 虞仲轶 / 2016-1-1 / 49.00

2015年互联网界乃至整个商界的最热门字眼,恐怕就是“共享经济”了。共享经济模式正以前所未有的速度与规模席卷全球。那么,共享经济为什么会产生?其本质是什么?共享经济会为我们带来什么价值?成功的共享经济商业模式是怎样的?如何管理和运作一家共享经济企业?在未来,共享经济还将面临哪些挑战?共享经济的下一个发展机会在哪里?传统经济又该如何应对? 作为国内第一本系统性阐述共享经济的书籍,本书通过对全球......一起来看看 《共享经济大趋势》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

URL 编码/解码
URL 编码/解码

URL 编码/解码

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试