「前端刷题」83. 删除排序链表中的重复元素

86 阅读2分钟

「这是我参与11月更文挑战的第21天,活动详情查看:2021最后一次更文挑战」。

题目

链接:leetcode-cn.com/problems/re…

存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除所有重复的元素,使每个元素 只出现一次

返回同样按升序排列的结果链表。

 

示例 1:

**输入:**head = [1,1,2] 输出:[1,2]

示例 2:

**输入:**head = [1,1,2,3,3] 输出:[1,2,3]

 

提示:

  • 链表中节点数目在范围 [0, 300]
  • -100 <= Node.val <= 100
  • 题目数据保证链表已经按升序排列

解题思路

思路1

  • 首先题目明确了链表是已经排序好了的,所以重复的元素一定连在一起
  • 这个题目跟26. 删除有序数组中的重复项 使用的技巧一模一样
  • 让慢指针slow走在后面,快指针fast走在前面探路,找到一个不重复的元素就告诉slow并让slow前进一步,这样当fast指针遍历完整个链表后,将慢指针的next指向null,就达到了去除重复元素的目的。

代码

/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var deleteDuplicates = function (head) {
  if (head == null) {
    return null;
  }
  let slow = head,
    fast = head;
  while (fast != null) {
    if (fast.val != slow.val) {
      slow.next = fast;
      slow = slow.next;
    }
    fast = fast.next;
  }
  // 断开与后面重复元素的连接
  slow.next = null;
  return head;
};

思路2

  • 在考虑边界值的情况下,创建链表位置指针 curr
  • 通过调用已知函数 ListNode() 的 .val 进行两两链表节点值对比
  • 若元素值同则说明重复,让指针 curr 通过 .next 跳过重复节点
  • 若元素值不同,继续指向下个节点
  • 最后返回开头节点 head,即可得到整条链表
/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var deleteDuplicates = function(head) {
  if (!head) {
    return head;
  }
  let curr = head;
  while (curr !== null && curr.next !== null) {
    if (curr.val === curr.next.val) {
      curr.next = curr.next.next;
    } else {
      curr = curr.next;
    }
  }
  return head;
};