题目
给定一个已排序的链表的头
head
, 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。
分析
- 链表元素
- 有重复项,有重复项的地方需要跳过
解法:双指针
思路
1. 因为是需要返回一个链表 我这边采取重新造一个链表 pre ,相当于一个慢指针
2. 才用一个快指针i进行探路
1. 因为有重复值 所以当 pre.val!==i.val 的时候,给pre.next添加一个
值为new ListNode(i.val)的节点
// @lc code=start
var deleteDuplicates = function (head) {
// 因为链表长度可能为0 所以排除 链表长度为0 和为1的情况
if (!head || !head.next) return head;
// 制造一个dummy节点 来记录链表头部
const dummy = new ListNode();
// 新建一个pre链表,相当于一个慢指针
let pre = new ListNode(head.val);
// 创建一个指针来探路
let i = head.next;
dummy.next = pre;
while (i) {
if (i.val !== pre.val) {
pre.next = new ListNode(i.val);
pre = pre.next;
}
i = i.next;
}
return dummy.next;
};
//时间复杂度:O(n)
//空间复杂度:O(n)
// @lc code=end
总结
今天这道题是主要是练习使用双指针来除去多余的数字类题目,这道题和 80.删除重复数组项2很相似.
大家可以看看我分享的一个专栏(前端搞算法)里面有更多关于算法的题目的分享,希望能够帮到大家,我会尽量保持每天晚上更新,如果喜欢的麻烦帮我点个赞,十分感谢
大家如果对“TS”感兴趣的可以看看我的专栏 (TypeScript常用知识),感谢大家的支持
文章内容目的在于学习讨论与分享学习算法过程中的心得体会,文中部分素材来源网络,如有侵权,请联系删除,邮箱 182450609@qq.com
\