Skip to content

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

  • 题号:82
  • 来源:LeetCode
  • 难度:中等
  • 标签:链表 双指针
  • 语言:TypeScript
  • 解法:3 个
  • 作者:lmliheng
  • 最近更新:2026-09-27

解法一 ​

TypeScript · 更新于 2026-09-27

虚拟头加双指针的尝试,指针未推进,未完成

typescript
/**
 * @difficulty medium
 * @tags 链表,双指针
 * @note 虚拟头加双指针的尝试,指针未推进,未完成
 * @82. 删除排序链表中的重复元素 II
 */

class ListNode {
    val: number
    next: ListNode | null
    constructor(val?: number, next?: ListNode | null) {
        this.val = (val === undefined ? 0 : val)
        this.next = (next === undefined ? null : next)
    }
}

let head = new ListNode(1, new ListNode(2, new ListNode(3, new ListNode(3, new ListNode(4, new ListNode(4, new ListNode(5)))))))


if (head === null) {
    console.log('链表为空')
}
let isDelete = false
// 虚拟头节点
let Vhead = new ListNode(0, head)

let deleteNode = Vhead
let n1 = Vhead.next
let n2 = Vhead.next?.next //...
while (n2?.next) {
    if (n1?.val === n2.val) {
        n2 = n2.next
        isDelete = true

    } else {

        if (isDelete) {
            deleteNode.next = n2 // 截断
            isDelete = false
        } else {
            // deleteNode= deleteNode.next
            // n1 = n1.next
            // n2 = n2.next

        }


    }


}
console.log(Vhead.next)

源码:ts/leetcode/82. 删除排序链表中的重复元素 II.ts

解法二 · TypeScript ​

TypeScript · 更新于 2026-09-27

文件内是反转区间链表的解法,本题未实现

typescript
/**
 * @difficulty medium
 * @tags 链表,双指针
 * @note 文件内是反转区间链表的解法,本题未实现
 * @82. 删除排序链表中的重复元素 II(解法二)
 */

class ListNode {
    val: number;
    next: ListNode | null;
    constructor(val?: number, next?: ListNode | null) {
        this.val = (val === undefined ? 0 : val)
        this.next = (next === undefined ? null : next)
    }
}

let head: ListNode = new ListNode(1, new ListNode(2, new ListNode(3, new ListNode(4, new ListNode(5, null)))))
let right: number = 4
let left: number = 2

let goal: ListNode = JSON.parse(JSON.stringify(head))

// 需要深拷贝链表 goal是新链表与head无关了
let r_pre: ListNode = goal // 在goal上
let r: ListNode = goal
// 获取left right,左右边半截链表
// 截取
while (r.val !== right) {
    // r的next是否为null
    if (r.next !== null) {
        r_pre = r
        r = r.next
        // console.log('r_pre:',r_pre)
        // console.log('r:',r)
    } else {
        break
    }
    if (goal.val !== left) {
        goal = goal.next!
        //    console.log('goal后移一位',goal)
    }
}
//截断
r_pre.next!.next = null
// console.log(goal)

const reverseNodeList = (head: ListNode | null): ListNode | null => {
    let pre: ListNode | null = null
    let p1: ListNode | null = head

    while (p1) {
        let temp: ListNode | null = p1.next
        p1.next = pre
        pre = p1
        p1 = temp
    }
    return pre
}

// console.log(reverseNodeList(head))
goal = reverseNodeList(goal)!

// 合并新链表
let point: ListNode = head
let point2: ListNode = head

while (point2.val !== right) {
    if (point2.next!.val == right) {
        break
    }
    point2 = point2.next!
}

while (point.val !== left) {
    if (point.next!.val == left) {
        point.next = goal
        break
    }
    point = point.next!
}

console.log(head)

export {};

源码:ts/leetcode/82. 删除排序链表中的重复元素 II(解法二).ts

解法三 · TypeScript ​

TypeScript · O(n) 时间 · O(1) 空间 · 更新于 2026-09-27

虚拟头加三指针,整段跳过重复值并处理尾部

typescript
/**
 * @difficulty medium
 * @tags 链表,双指针
 * @time O(n)
 * @space O(1)
 * @note 虚拟头加三指针,整段跳过重复值并处理尾部
 * @82. 删除排序链表中的重复元素 II(解法三)
 */

class ListNode {
    val: number;
    next: ListNode | null;
    constructor(val?: number, next?: ListNode | null) {
        this.val = (val === undefined ? 0 : val)
        this.next = (next === undefined ? null : next)
    }
}

let head: ListNode = new ListNode(1, new ListNode(2, new ListNode(3, new ListNode(3, new ListNode(3, new ListNode(4, new ListNode(4, null)))))))

if (head === null) {
    console.log('链表为空')
}
let isDelete: boolean = false
// 虚拟头节点
let Vhead: ListNode = new ListNode(0, head)

let deleteNode: ListNode = Vhead
let n1: ListNode | null = Vhead.next
let n2: ListNode | null = Vhead.next?.next ?? null
while (n2) {
    if (n1?.val === n2.val) {
        n2 = n2.next
        isDelete = true
    } else {
        if (isDelete) {
            deleteNode.next = n2 // 截断
            n1 = n2
            n2 = n2.next
            isDelete = false
        } else {
            deleteNode = deleteNode.next!
            n1 = n1.next
            n2 = n2.next
        }
    }
}

if (isDelete) {
    deleteNode.next = null
}
console.log(Vhead.next)

export {};

源码:ts/leetcode/82. 删除排序链表中的重复元素 II(解法三).ts


在 GitHub 上查看题目所在目录:lmliheng/algorithm