持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第6天,点击查看活动详情
一、题目描述:
83. 删除排序链表中的重复元素 - 力扣(LeetCode) (leetcode-cn.com)
给定一个已排序的链表的头
head, 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。
示例 1:
输入:head = [1,1,2]
输出:[1,2]
示例 2:
输入:head = [1,1,2,3,3]
输出:[1,2,3]
提示:
- 链表中节点数目在范围 [0, 300] 内
- -100 <= Node.val <= 100
- 题目数据保证链表已经按升序 排列
二、思路分析:
本题的主要技巧在于快慢指针。
注意点:
- 快指针fast在while的循环条件是fast是否存在,而不是fast.next是否存在(因为会跳过最后一个链表元素);
- slow.next指向fast(作为一个链表结构,而不是fast.val);
- 快指针走完之后,慢指针切断后面的元素,slow.next=None;
- 最后返回原始头节点head即可
三、AC 代码:
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} head
* @return {ListNode}
*/
var deleteDuplicates = function(head) {
let current = head //把首节点指针赋值给current
while(current && current.next) { //当前节点以及下一节点不为空时
if(current.val === current.next.val) { //值相等
current.next = current.next.next
}else {
current = current.next //值不相等
}
}
return head //返回首节点
}
// 易于理解版,这个逻辑与上面大同小异,只是写的详细点
var deleteDuplicates = function(head) {
if(!head) return null
let q = head
let p = q.next
while(p) {
if(q.val === p.val) {
q.next = p.next
p = null
p = q.next
}else {
q = p
p = p.next
}
}
return head
};
范文参考:
C语言 题解 - 删除排序链表中的重复元素 - 力扣(LeetCode)