083.删除排序链表中的重复元素
作者:沉默王二
发布时间:2023-09-29T08:53:07.681+0800
本题解同时收录在星球专栏《二哥的 LeetCode 刷题笔记》中,专栏托管在语雀平台上(更方便你沉浸式阅读和做笔记),访问地址和密码:https://t.zsxq.com/6iuzn6I
题意
给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。
难度
简单
示例
示例1:
输入:head = [1,1,2]
示例2:
输入:head = [1,1,2]
分析
注意,本题跟 082.删除排序链表中的重复元素 II 很像,差别就是本题只需要保留一个重复的元素,而 082 需要把所有重复的元素全部删除。
既然很像,那我们就可以采用同样的解题思路。
- 从链表头部 head 开始遍历整个链表。
- 检查当前节点(cur)和下一个节点(cur.next )的值。如果它们相同,则跳过下一个节点(即删除 cur.next 节点)。通过 cur.next = cur.next.next 来实现。
- 如果当前节点和下一个节点的值不同,则移动 cur 到下一个节点。
来看题解。
/**
* public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val = val; this.next = next; } * } */class Solution { public ListNode deleteDuplicates(ListNode head) { // 如果链表为空或只有一个节点,直接返回 if (head == null){ return null; }
// 初始化cur指针,从头结点开始 ListNode cur = head;
// 遍历链表,直到cur或cur.next为null while (cur.next != null) { // 检查当前节点的值和下一个节点的值是否相同 if (cur.val == cur.next.val) { // 如果相同,删除下一个节点(通过跳过下一个节点来实现) cur.next = cur.next.next; } else { // 如果不同,将cur移动到下一个节点 cur = cur.next; } }
// 返回修改后的链表的头结点 return head; }}
我们来模拟一下整个过程。假设已排序的链表为: 1 -> 1 -> 2 -> 3 -> 3
初始化cur指向头节点。
[cur]1 -> 1 -> 2 -> 3 -> 3
首先,检查cur和cur.next 。它们的值都是 1,所以我们删除cur.next 节点:
[cur]1 -> 2 -> 3 -> 3
然后,cur指向的值(1)和其下一个节点的值(2)不相同。所以,移动cur到下一个节点:
1 -> [cur]2 -> 3 -> 3
再次,cur指向的值(2)和其下一个节点的值(3)不相同。所以,移动cur到下一个节点:
1 -> 2 -> [cur]3 -> 3
现在,cur和cur.next 的值都是 3,所以我们删除cur.next 节点:
1 -> 2 -> [cur]3
此时,cur.next 为空,停止循环。
最终链表为: 1 -> 2 -> 3
那这次我们不需要用到虚拟节点 grandFather 了,因为我们的题解必然会把第一个元素保留下来,无论它重不重复。
来看一下题解的效率:
总结
本题大致与 082.删除排序链表中的重复元素 II 一致,所不同的是,需要留下一个重复元素,这是一道非常简单的链表题目,相信大家都能解出来。
力扣链接:https://leetcode.cn/problems/remove-duplicates-from-sorted-list/
一步一个脚印
不积跬步无以至千里,不积小流无以成江海。LeetCode - 100天从算法小白到卷王正式启动了,我们计划周一到周五至少每天更新一篇,周六周日更新一篇,目标 300 道 LeetCode 经典题。
PDF 版本目前只针对**二哥编程星球 的球友开放,如果你也想一起打卡学习算法的话,戳链接 **加入我们吧。
一个人可以走得很快,但一群人才能走得更远。二哥编程星球 (目前已有 3500 多名球友加入)里面的每个球友都非常的友善,除了鼓励你,还会给你提出合理的建议,一起冲!
本题解同时收录在星球专栏《二哥的 LeetCode 刷题笔记》中,专栏托管在语雀平台上(更方便你沉浸式阅读和做笔记),访问地址和密码:https://t.zsxq.com/6iuzn6I
题意
给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。
难度
简单
示例
示例1:
输入:head = [1,1,2]
示例2:
输入:head = [1,1,2]
分析
注意,本题跟 082.删除排序链表中的重复元素 II 很像,差别就是本题只需要保留一个重复的元素,而 082 需要把所有重复的元素全部删除。
既然很像,那我们就可以采用同样的解题思路。
- 从链表头部 head 开始遍历整个链表。
- 检查当前节点(cur)和下一个节点(cur.next )的值。如果它们相同,则跳过下一个节点(即删除 cur.next 节点)。通过 cur.next = cur.next.next 来实现。
- 如果当前节点和下一个节点的值不同,则移动 cur 到下一个节点。
来看题解。
/**
* public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val = val; this.next = next; } * } */class Solution { public ListNode deleteDuplicates(ListNode head) { // 如果链表为空或只有一个节点,直接返回 if (head == null){ return null; }
// 初始化cur指针,从头结点开始 ListNode cur = head;
// 遍历链表,直到cur或cur.next为null while (cur.next != null) { // 检查当前节点的值和下一个节点的值是否相同 if (cur.val == cur.next.val) { // 如果相同,删除下一个节点(通过跳过下一个节点来实现) cur.next = cur.next.next; } else { // 如果不同,将cur移动到下一个节点 cur = cur.next; } }
// 返回修改后的链表的头结点 return head; }}
我们来模拟一下整个过程。假设已排序的链表为: 1 -> 1 -> 2 -> 3 -> 3
初始化cur指向头节点。
[cur]1 -> 1 -> 2 -> 3 -> 3
首先,检查cur和cur.next 。它们的值都是 1,所以我们删除cur.next 节点:
[cur]1 -> 2 -> 3 -> 3
然后,cur指向的值(1)和其下一个节点的值(2)不相同。所以,移动cur到下一个节点:
1 -> [cur]2 -> 3 -> 3
再次,cur指向的值(2)和其下一个节点的值(3)不相同。所以,移动cur到下一个节点:
1 -> 2 -> [cur]3 -> 3
现在,cur和cur.next 的值都是 3,所以我们删除cur.next 节点:
1 -> 2 -> [cur]3
此时,cur.next 为空,停止循环。
最终链表为: 1 -> 2 -> 3
那这次我们不需要用到虚拟节点 grandFather 了,因为我们的题解必然会把第一个元素保留下来,无论它重不重复。
来看一下题解的效率:
总结
本题大致与 082.删除排序链表中的重复元素 II 一致,所不同的是,需要留下一个重复元素,这是一道非常简单的链表题目,相信大家都能解出来。
力扣链接:https://leetcode.cn/problems/remove-duplicates-from-sorted-list/
一步一个脚印
不积跬步无以至千里,不积小流无以成江海。LeetCode - 100天从算法小白到卷王正式启动了,我们计划周一到周五至少每天更新一篇,周六周日更新一篇,目标 300 道 LeetCode 经典题。
PDF 版本目前只针对**二哥编程星球 的球友开放,如果你也想一起打卡学习算法的话,戳链接 **加入我们吧。
一个人可以走得很快,但一群人才能走得更远。二哥编程星球 (目前已有 3500 多名球友加入)里面的每个球友都非常的友善,除了鼓励你,还会给你提出合理的建议,一起冲!
本题解同时收录在星球专栏《二哥的 LeetCode 刷题笔记》中,专栏托管在语雀平台上(更方便你沉浸式阅读和做笔记),访问地址和密码:https://t.zsxq.com/6iuzn6I
题意
给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。
难度
简单
示例
示例1:
输入:head = [1,1,2]
示例2:
输入:head = [1,1,2]
分析
注意,本题跟 082.删除排序链表中的重复元素 II 很像,差别就是本题只需要保留一个重复的元素,而 082 需要把所有重复的元素全部删除。
既然很像,那我们就可以采用同样的解题思路。
- 从链表头部 head 开始遍历整个链表。
- 检查当前节点(cur)和下一个节点(cur.next )的值。如果它们相同,则跳过下一个节点(即删除 cur.next 节点)。通过 cur.next = cur.next.next 来实现。
- 如果当前节点和下一个节点的值不同,则移动 cur 到下一个节点。
来看题解。
/**
* public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val = val; this.next = next; } * } */class Solution { public ListNode deleteDuplicates(ListNode head) { // 如果链表为空或只有一个节点,直接返回 if (head == null){ return null; }
// 初始化cur指针,从头结点开始 ListNode cur = head;
// 遍历链表,直到cur或cur.next为null while (cur.next != null) { // 检查当前节点的值和下一个节点的值是否相同 if (cur.val == cur.next.val) { // 如果相同,删除下一个节点(通过跳过下一个节点来实现) cur.next = cur.next.next; } else { // 如果不同,将cur移动到下一个节点 cur = cur.next; } }
// 返回修改后的链表的头结点 return head; }}
我们来模拟一下整个过程。假设已排序的链表为: 1 -> 1 -> 2 -> 3 -> 3
初始化cur指向头节点。
[cur]1 -> 1 -> 2 -> 3 -> 3
首先,检查cur和cur.next 。它们的值都是 1,所以我们删除cur.next 节点:
[cur]1 -> 2 -> 3 -> 3
然后,cur指向的值(1)和其下一个节点的值(2)不相同。所以,移动cur到下一个节点:
1 -> [cur]2 -> 3 -> 3
再次,cur指向的值(2)和其下一个节点的值(3)不相同。所以,移动cur到下一个节点:
1 -> 2 -> [cur]3 -> 3
现在,cur和cur.next 的值都是 3,所以我们删除cur.next 节点:
1 -> 2 -> [cur]3
此时,cur.next 为空,停止循环。
最终链表为: 1 -> 2 -> 3
那这次我们不需要用到虚拟节点 grandFather 了,因为我们的题解必然会把第一个元素保留下来,无论它重不重复。
来看一下题解的效率:
总结
本题大致与 082.删除排序链表中的重复元素 II 一致,所不同的是,需要留下一个重复元素,这是一道非常简单的链表题目,相信大家都能解出来。
力扣链接:https://leetcode.cn/problems/remove-duplicates-from-sorted-list/
一步一个脚印
不积跬步无以至千里,不积小流无以成江海。LeetCode - 100天从算法小白到卷王正式启动了,我们计划周一到周五至少每天更新一篇,周六周日更新一篇,目标 300 道 LeetCode 经典题。
PDF 版本目前只针对**二哥编程星球 的球友开放,如果你也想一起打卡学习算法的话,戳链接 **加入我们吧。
一个人可以走得很快,但一群人才能走得更远。二哥编程星球 (目前已有 3500 多名球友加入)里面的每个球友都非常的友善,除了鼓励你,还会给你提出合理的建议,一起冲!
知识星球
扫码加入星球
查看更多优质内容
https://wx.zsxq.com/mweb/views/joingroup/join_group.html?group_id=15522885221412