Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一.题目
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- 题目数据保证链表已经按升序 排列
二、思路分析:
这道题显然是我写过的文章第15个题的变形题,同时也是一个链表数据结构的题目,所以我们可以采用双指针来解决这个题目,首先快慢指针全部初始化指向链表头,循环的结束条件则是快指针是否为空,如果慢指针指定的值不等于快指针的值,那么慢指针的下一个指针指向快指针,再把慢指针指向它的下个节点头部,每次循环都会让快指针移动至下个节点的头部。
需要注意的是,如果循环结束了,我们需要将慢指针的next指针置为空,这样可以防止后面有重复的值。
三、代码:
/**
* 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 == null) return head
let slow = head
let fast = head
// //双指针
while(fast){
if(slow.val !== fast.val){
slow.next = fast
slow = slow.next
}
fast = fast.next
}
//断开与其他重复元素的连接
slow.next = null
return head
};
四、总结:
这道题的思路基本与我上篇文章的解题思路一致,所以遇到这类的问题我们都可以使用双指针进行求解。