参加了 kkb 的门徒培训,想要记录下自己的成长过程。每天一篇,坚持不断更 --- 2022.3.11
题目描述
给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。
示例 1:
输入: head = [1,2,3,3,4,4,5]
输出: [1,2,5]
示例 2:
输入: head = [1,1,1,2,3]
输出: [2,3]
提示:
- 链表中节点数目在范围
[0, 300]内 -100 <= Node.val <= 100- 题目数据保证链表已经按升序 排列
解题思路
这一个不断查找需要跳过点并跳过的过程。
/**
* @param {ListNode} head
* @return {ListNode}
*/
var deleteDuplicates = function (head) {
// 判断 head 是否为空
if (!head || !head.next) return head;
// 由于 头节点可能被删除
let hair = new ListNode(-1, head),
p = hair,
q;
while (p.next) {
// 判断需要跳过的点
if (p.next.next && p.next.val === p.next.next.val) {
q = p.next.next;
// 找到 与 p 下个节点不同的值
while (q && q.val === p.next.val) {
q = q.next;
}
// 使其挂载到 p 的下一个节点
p.next = q;
} else {
p = p.next;
}
}
return hair.next;
};