返回

在程序宇宙中凌云飞舞——LeetCode 83:删除排序链表中的重复元素

前端

前言

代码的世界如同浩瀚无边的宇宙,蕴藏着无数奥秘,引人探索。LeetCode 作为一道道宇宙中的题海,等待着我们去征服。今天,让我们将目光锁定在 LeetCode 83:删除排序链表中的重复元素,在这道题海中凌云飞舞,舞出不一样的代码风采!

题意与解答

题意

给定一个按升序排列的链表,其中某些元素可能出现重复,请删除所有重复的元素,使得每个元素只出现一次。

解答

在解决这个问题时,我们可以运用分而治之的思想,将链表逐个切分,再将其逐个征服,最终得到一个没有重复元素的新链表。

首先,我们定义一个 helper 函数来处理链表的分割。该函数接收一个链表头节点 head 和一个终止节点 end,它的目的是将链表从 head 节点到 end 节点处切分,并返回切分后的两个链表的头节点。

def helper(head, end):
    # 如果当前链表为空或只有一个节点,直接返回
    if head is None or head.next is None:
        return head, None

    # 设置慢指针和快指针,并初始化它们的位置
    slow = head
    fast = head.next

    # 当快指针没有到达终止节点时,继续循环
    while fast != end:
        # 如果快指针和慢指针指向同一个节点,说明找到了重复元素
        if fast.val == slow.val:
            # 将快指针指向下一个节点,并将慢指针指向当前节点的下一个节点
            fast = fast.next
            slow.next = fast
        # 如果快指针和慢指针指向不同的节点,说明找到了不重复的元素
        else:
            # 将慢指针指向下一个节点
            slow = slow.next
            # 将快指针指向下一个节点
            fast = fast.next

    # 返回切分后的两个链表的头节点
    return head, slow.next

接下来,我们使用 helper 函数将链表逐个切分,并逐个征服。在每次切分后,我们都会得到一个没有重复元素的新链表。

def delete_duplicates(head):
    # 如果链表为空,直接返回
    if head is None:
        return head

    # 初始化一个伪头节点,将链表连接到伪头节点之后
    dummy = ListNode(0, head)

    # 设置当前链表的头节点和终止节点
    current_head = dummy
    current_end = head

    # 循环直到终止节点为 None
    while current_end is not None:
        # 切分链表,得到两个新的链表头节点
        new_head, new_end = helper(current_head.next, current_end)

        # 将新的链表连接到伪头节点之后
        current_head.next = new_head

        # 更新当前链表的头节点和终止节点
        current_head = new_head
        current_end = new_end

    # 返回伪头节点的下一个节点,即删除重复元素后的链表头节点
    return dummy.next

结语

LeetCode 83:删除排序链表中的重复元素是一道考验代码功底的题目。通过分而治之的思想,我们能够将链表逐个切分,并逐个征服,最终得到一个没有重复元素的新链表。希望这篇文章能够帮助您更好地理解这道题目,并在代码的世界中凌云飞舞,舞出不一样的风采!