携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第4天,点击查看活动详情
一、题目
LeetCode 删除排序链表中的重复元素
给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。
示例 1:*
输入:head = [1,1,2]
输出:[1,2]
示例 2:
输入:head = [1,1,2,3,3]
输出:[1,2,3]
提示:
链表中节点数目在范围 [0, 300] 内
-100 <= Node.val <= 100
题目数据保证链表已经按升序 排列
二、题解
题目给定的有一个链表,链表中可能存在重复的节点元素值,需要将重复的元素值去掉,使得链表的元素节点值唯一,链表中的节点元素为升序的。
方法一
简单来说因为题目给定的链表是已经排序的了,既然都是按节点元素值排序了那么重复的节点必定是连续出现的了,那么就可以对给定链表遍历一次,首先可以新建一个链表,先保存好第一个节点,然后遍历其余的节点,如果之后的节点与之前保存的节点值相同那么就跳过,这样就去掉了重复的节点,只不过这样属于复制链表一样了。如果不要新建链表来保存,那么也可以直接在原链表的基础上进行修改,同样基于已经排序好的链表,重复的元素都是相邻的,那么只需要遍历一次链表,对于重复的元素节点进行删除即可。首先遍历给定链表通过一个节点指针pNode,初始的指向链表head的节点,然后往后遍历pNode的下一个节点不为空就继续,然后遍历过程中判断节点值,如果当前节点值与当前节点的下一个节点值相同的话,那么就需要去掉重复的节点,直接将下一个重复的节点删除,即将当前节点的next指向下下一个节点pNode.next = pNode.next.next。否则就是节点就唯一的不需要任何操作,直接继续遍历下一个节点即可,最后遍历完成直接返回原链表head即可。
三、代码
方法一 Java代码
class Solution {
public ListNode deleteDuplicates(ListNode head) {
if (head == null) {
return head;
}
ListNode pNode = head;
while (pNode.next != null) {
if (pNode.val == pNode.next.val) {
pNode.next = pNode.next.next;
} else {
pNode = pNode.next;
}
}
return head;
}
}
时间复杂度:O(n),需要遍历一次链表节点。
空间复杂度:O(1),只需常数的空间。