1.题目

82. 删除排序链表中的重复元素 II

难度中等746收藏分享切换为英文接收动态反馈
82. 删除排序链表中的重复元素 II - 图1
存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字。
返回同样按升序排列的结果链表。

示例 1:
输入:head = [1,2,3,3,4,4,5] 输出:[1,2,5]
82. 删除排序链表中的重复元素 II - 图2
示例 2:
输入:head = [1,1,1,2,3] 输出:[2,3]

提示:

2.题解

解题思路

遍历两次,第一次去重,把重复元素的值保存,第二次再次遍历。

代码

  1. /**
  2. * Definition for singly-linked list.
  3. * function ListNode(val, next) {
  4. * this.val = (val===undefined ? 0 : val)
  5. * this.next = (next===undefined ? null : next)
  6. * }
  7. */
  8. /**
  9. * @param {ListNode} head
  10. * @return {ListNode}
  11. */
  12. var deleteDuplicates = function(head) {
  13. const dum = new ListNode(-1000);
  14. dum.next = head;
  15. let cur = dum;
  16. let arr = [];
  17. while (cur && cur.next) {
  18. let next = cur.next;
  19. if (next.val !== cur.val) {
  20. cur = cur.next;
  21. } else {
  22. arr.push(cur.val);
  23. cur.next = cur.next.next;
  24. }
  25. }
  26. let p = dum;
  27. console.log('p', p);
  28. while(p && p.next) {
  29. let val = p.next.val;
  30. if(arr.indexOf(val) > -1) {
  31. p.next = p.next.next;
  32. } else {
  33. p = p.next;
  34. }
  35. }
  36. return dum.next;
  37. };

上面的方法比较笨,还有一种办法是。:
就是遍历的是 用两个变量cur.next, cur.next.next 内部嵌套while去重x

  1. var deleteDuplicates = function(head) {
  2. if (!head) {
  3. return head;
  4. }
  5. const dummy = new ListNode(0, head);
  6. let cur = dummy;
  7. while (cur.next && cur.next.next) {
  8. if (cur.next.val === cur.next.next.val) {
  9. const x = cur.next.val;
  10. while (cur.next && cur.next.val === x) {
  11. cur.next = cur.next.next;
  12. }
  13. } else {
  14. cur = cur.next;
  15. }
  16. }
  17. return dummy.next;
  18. };