说在前面
🎈不知道大家对于算法的学习是一个怎样的心态呢?为了面试还是因为兴趣?不管是出于什么原因,算法学习需要持续保持。
题目描述
给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。
示例 1:
输入:head = [1,2,3,3,4,4,5] 输出:[1,2,5]
示例 2:
输入:head = [1,1,1,2,3] 输出:[2,3]
提示:
- 链表中节点数目在范围 [0, 300] 内
- -100 <= Node.val <= 100
- 题目数据保证链表已经按升序 排列
解题思路
- 首先判断链表是否为空,如果为空则直接返回。
- 创建一个哨兵节点,并将其指向链表的头部。
- 创建一个指针变量node,初始化为哨兵节点。
- 进入循环,判断node的下一个节点和下下个节点是否存在。
- 如果node的下一个节点和下下个节点的值相等,则说明存在重复元素。
- 将x赋值为重复元素的值。
- 在内部循环中,只要node的下一个节点存在且值等于x,就将node的下一个节点指向下一个节点的下一个节点,以删除重复元素。
- 如果node的下一个节点和下下个节点的值不相等,则将node指向下一个节点,继续遍历。
- 循环结束后,返回哨兵节点的下一个节点,即为去重后的链表。
- 这段代码的时间复杂度为O(n),其中n为链表的长度。
AC代码
/** * Definition for singly-linked list. * function ListNode(val, next) { * this.val = (val===undefined ? 0 : val) * this.next = (next===undefined ? null : next) * } */ /** * @param {ListNode} head * @return {ListNode} */ var deleteDuplicates = function(head) { if (!head) { return head; } const res = {next:head}; let node = res; while (node.next && node.next.next) { if (node.next.val === node.next.next.val) { const x = node.next.val; while (node.next && node.next.val === x) { node.next = node.next.next; } } else { node = node.next; } } return res.next; };
公众号
关注公众号『前端也能这么有趣
』,获取更多有趣内容。
说在后面
🎉 这里是 JYeontu,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打羽毛球 🏸 ,平时也喜欢写些东西,既为自己记录 📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解 🙇,写错的地方望指出,定会认真改进 😊,偶尔也会在自己的公众号『
前端也能这么有趣
』发一些比较有趣的文章,有兴趣的也可以关注下。在此谢谢大家的支持,我们下文再见 🙌。