LeetCode83、删除排序链表中的重复元素

36 阅读2分钟

LeetCode 系列记录我学习算法的过程。

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第7天,点击查看活动详情

题目

给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。

示例:

image.png

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

image.png

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

提示

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

思路

又是久违的链表题,这题相当于数组去重,而且给定的链表还是排好序的升序链表

那思路就很清晰了,相同项都是相邻项,只需要按顺序遍历一遍,将相邻的重复项删除即可:

  • 首先考虑边界情况,长度为 01 时无需去重,直接返回链表
  • 定义一个指针 temp 来遍历链表
  • 开始遍历,当指针指向的节点为空或下一节点为空时结束循环
  • 当指针指向的节点值与下一节点值相同时,将下一节点从链表中去除
  • 值不一样则将指针指向下一节点
  • 最后返回处理后的链表

细节:一开始我的结束条件是判断是否还有下一节点,但是执行报错后才发现有问题,因为循环里的操作有可能会出现把最后一个节点删除,这是移动当前指针指向下一节点就是 null,这时判断是否有下一节点就会报错,所以结束条件应该是当前节点或下一节点为空时

代码实现

/**
 * 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) {
    // 当链表长度为 0 或 1 时,直接返回该链表
    if (!head || !head.next) return head
    // 定义指针进行遍历
    let temp = head
    // 当前节点或下一节点都不为空才进行循环
    while(temp && temp.next) {
        // 当前节点值与下一节点值相同,则删除下一节点
        if(temp.next.val === temp.val) {
            temp.next = temp.next.next
        } else {
            // 不同则移动指针指向下一节点
            temp = temp.next
        }
    }
    // 返回链表
    return head
};

image.png