返回

深度剖析算法题解:LeetCode 82. 删除排序链表中的重复元素 II

前端

好的,以下是根据您的输入所生成的专业级别文章:

前言

踏上算法修炼之旅,每日一道算法题,精进不辍。继昨日探讨「删除排序链表中的重复元素」后,今日我们再进一步,挑战「删除排序链表中的重复元素 II」。

题目剖析

题目要求:

给定一个已排序的链表,删除所有重复的元素,使每个元素只出现一次。

例如:

给定 $1->2->3->3->4->4->5,返回 $1->2->5

给定 $1->1->1->2->3,返回 $2->3

题解思路

解决此题的关键在于处理重复元素。由于链表已排序,我们可以利用这一特性,采用双指针法逐个遍历链表。

  1. 设置两个指针:curr 指向当前节点,prev 指向前一个节点。
  2. curr 指向的节点与 prev 指向的节点相等时,说明遇到重复元素。
  3. 此时,我们需要删除 curr 指向的节点。由于链表已排序,因此 curr 指向的节点之后的节点都与 curr 指向的节点相等。
  4. 因此,我们可以将 curr 指针移动到下一个非重复元素,然后将 prev 指针指向该非重复元素。
  5. 重复步骤 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 题的深入剖析,我们掌握了处理链表中重复元素的技巧。算法修炼之路永无止境,期待与您共同探索更多精彩的算法题解。