如果有其他更好的方法,欢迎在评论区留言~
题目描述
删除给出链表中的重复元素(链表中元素从小到大有序),使链表中的所有元素都只出现一次
例如:
给出的链表为1→1→2,返回1→2.
给出的链表为1→1→2→3→3,返回1→2→3.
数据范围:链表长度满足 0≤n≤100,链表中任意节点的值满足∣val∣≤100
进阶:空间复杂度 O(1),时间复杂度 O(n)
知识点
链表
示例
输入:
{1,1,2}
返回值:
{1,2}
输入:
{}
返回值:
{}
解题过程
方法一:遍历删除
具体做法:
- 判断链表是否为空链表,空链表不处理直接返回。
- 使用一个指针遍历链表,如果指针当前节点与下一个节点的值相同,我们就跳过下一个节点,当前节点直接连接下个节点的后一位。
- 如果当前节点与下一个节点值不同,继续往后遍历。
- 循环过程中每次用到了两个节点值,要检查连续两个节点是否为空。
/*
* function ListNode(x){
* this.val = x;
* this.next = null;
* }
*/
/**
*
* @param head ListNode类
* @return ListNode类
*/
function deleteDuplicates( head ) {
// write code here
if(head==null){
return head;
}
var cur=head; //遍历指针
while(cur!=null && cur.next!=null){ //指针当前和下一位不为空
if(cur.val==cur.next.val){
cur.next=cur.next.next; //如果当前与下一位相等则忽略下一位
}
else{
cur=cur.next; //否则指针正常遍历
}
}
return head;
}
module.exports = {
deleteDuplicates : deleteDuplicates
};
复杂度分析
- 时间复杂度:O(n),其中n为链表长度,遍历一次链表
- 空间复杂度:O(1),常数级指针变量使用,没有使用额外的辅助空间
方法二:双指针
/*
* function ListNode(x){
* this.val = x;
* this.next = null;
* }
*/
/**
*
* @param head ListNode类
* @return ListNode类
*/
function deleteDuplicates( head ) {
// write code here
if(head==null || head.next==null){
return head;
}
var slow=head,fast=head.next;
while(fast!=null){
if(slow.val==fast.val){
slow.next=fast.next;
fast=fast.next;
}
else{
slow=slow.next;
fast=fast.next;
}
}
return head;
}
module.exports = {
deleteDuplicates : deleteDuplicates
};

文章介绍了如何在有序链表中删除重复元素,提供了两种方法:遍历删除和双指针法。遍历删除法通过判断当前节点与下一个节点的值是否相等来删除重复,而双指针法使用慢指针和快指针同步移动,遇到重复元素时跳过。两种方法的时间复杂度均为O(n),空间复杂度为O(1)。

被折叠的 条评论
为什么被折叠?



