返回
深度剖析算法题解:LeetCode 82. 删除排序链表中的重复元素 II
前端
2023-11-26 01:22:53
好的,以下是根据您的输入所生成的专业级别文章:
前言
踏上算法修炼之旅,每日一道算法题,精进不辍。继昨日探讨「删除排序链表中的重复元素」后,今日我们再进一步,挑战「删除排序链表中的重复元素 II」。
题目剖析
题目要求:
给定一个已排序的链表,删除所有重复的元素,使每个元素只出现一次。
例如:
给定 $1->2->3->3->4->4->5,返回 $1->2->5
给定 $1->1->1->2->3,返回 $2->3
题解思路
解决此题的关键在于处理重复元素。由于链表已排序,我们可以利用这一特性,采用双指针法逐个遍历链表。
- 设置两个指针:
curr
指向当前节点,prev
指向前一个节点。 - 当
curr
指向的节点与prev
指向的节点相等时,说明遇到重复元素。 - 此时,我们需要删除
curr
指向的节点。由于链表已排序,因此curr
指向的节点之后的节点都与curr
指向的节点相等。 - 因此,我们可以将
curr
指针移动到下一个非重复元素,然后将prev
指针指向该非重复元素。 - 重复步骤 2-4,直到
curr
指向链表的最后一个节点。
代码实现
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if (head == nullptr || head->next == nullptr) {
return head;
}
ListNode* prev = head;
ListNode* curr = head->next;
while (curr != nullptr) {
if (curr->val == prev->val) {
prev->next = curr->next;
delete curr;
curr = prev->next;
} else {
prev = curr;
curr = curr->next;
}
}
return head;
}
};
class Solution {
public ListNode deleteDuplicates(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode prev = head;
ListNode curr = head.next;
while (curr != null) {
if (curr.val == prev.val) {
prev.next = curr.next;
curr = prev.next;
} else {
prev = curr;
curr = curr.next;
}
}
return head;
}
}
def deleteDuplicates(head):
if head is None or head.next is None:
return head
prev = head
curr = head.next
while curr is not None:
if curr.val == prev.val:
prev.next = curr.next
curr = prev.next
else:
prev = curr
curr = curr.next
return head
结语
通过对 LeetCode 82 题的深入剖析,我们掌握了处理链表中重复元素的技巧。算法修炼之路永无止境,期待与您共同探索更多精彩的算法题解。