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