「这是我参与11月更文挑战的第21天,活动详情查看:2021最后一次更文挑战」。
题目
链接:leetcode-cn.com/problems/re…
存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除所有重复的元素,使每个元素 只出现一次 。
返回同样按升序排列的结果链表。
示例 1:
**输入:**head = [1,1,2] 输出:[1,2]
示例 2:
**输入:**head = [1,1,2,3,3] 输出:[1,2,3]
提示:
- 链表中节点数目在范围
[0, 300]内 -100 <= Node.val <= 100- 题目数据保证链表已经按升序排列
解题思路
思路1
- 首先题目明确了链表是已经排序好了的,所以重复的元素一定连在一起
- 这个题目跟26. 删除有序数组中的重复项 使用的技巧一模一样
- 让慢指针slow走在后面,快指针fast走在前面探路,找到一个不重复的元素就告诉slow并让slow前进一步,这样当fast指针遍历完整个链表后,将慢指针的next指向null,就达到了去除重复元素的目的。
代码
/**
* @param {ListNode} head
* @return {ListNode}
*/
var deleteDuplicates = function (head) {
if (head == null) {
return null;
}
let slow = head,
fast = head;
while (fast != null) {
if (fast.val != slow.val) {
slow.next = fast;
slow = slow.next;
}
fast = fast.next;
}
// 断开与后面重复元素的连接
slow.next = null;
return head;
};
思路2
- 在考虑边界值的情况下,创建链表位置指针 curr
- 通过调用已知函数 ListNode() 的 .val 进行两两链表节点值对比
- 若元素值同则说明重复,让指针 curr 通过 .next 跳过重复节点
- 若元素值不同,继续指向下个节点
- 最后返回开头节点 head,即可得到整条链表
/**
* 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;
}
let curr = head;
while (curr !== null && curr.next !== null) {
if (curr.val === curr.next.val) {
curr.next = curr.next.next;
} else {
curr = curr.next;
}
}
return head;
};