83. 删除排序链表中的重复元素
存在一个按升序排列的链表,给你这个链表的头节点 head
,请你删除所有重复的元素,使每个元素 只出现一次 。
返回同样按升序排列的结果链表。
示例 1:
输入:head = [1,1,2]
输出:[1,2]
示例 2:
输入:head = [1,1,2,3,3]
输出:[1,2,3]
提示:
- 链表中节点数目在范围
[0, 300]
内 -100 <= Node.val <= 100
- 题目数据保证链表已经按升序排列
一次遍历法
解题思路还是和 删除排序链表中的重复元素 II 差不多一样。
因为不存在会删除头节点,所以直接让当前指针 cur 指向链表的头结点开始,随后开始对链表进行遍历。如果当前 cur与 cur.next 对应的元素相同,那么我们就需要将 cur.next 指向cur.next.next,删除这个与cur相同大小的元素。如果当前 cur 与 cur.next 对应的元素不相同,那么说明链表中只有一个元素值为 cur.next 的节点,所以直接将 cur 指向 cur.next。
当遍历完整个链表之后,我们返回链表的头结点
class Solution {
public ListNode deleteDuplicates(ListNode head) {
if (head == null) {
return head;
}
ListNode cur = head;
while (cur.next != null) {
if (cur.val == cur.next.val) {
cur.next = cur.next.next;
} else {
cur = cur.next;
}
}
return head;
}
}
递归方法
递归套路解决链表问题:
- 找终止条件:当head指向链表只剩一个元素的时候,自然是不可能重复的,因此return head
- 想想应该返回什么值:应该返回的自然是已经去重的链表的头节点
- 每一步要做什么:宏观上考虑,此时head.next已经指向一个去重的链表了,而根据第二步,我应该返回一个去重的链表的头节点。因此这一步应该做的是判断当前的head和head.next是否相等,如果相等则说明重了,返回head.next,否则返回head
class Solution {
public ListNode deleteDuplicates(ListNode head) {
if(head == null || head.next == null){
return head;
}
//递归获得已经去重的链表的头结点
head.next = deleteDuplicates(head.next);
//如果重复元素,则跳过前一个
if(head.val == head.next.val) head = head.next;
//返回去重后的头结点
return head;
}
}