返回
在程序宇宙中凌云飞舞——LeetCode 83:删除排序链表中的重复元素
前端
2023-12-04 22:15:58
前言
代码的世界如同浩瀚无边的宇宙,蕴藏着无数奥秘,引人探索。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:删除排序链表中的重复元素是一道考验代码功底的题目。通过分而治之的思想,我们能够将链表逐个切分,并逐个征服,最终得到一个没有重复元素的新链表。希望这篇文章能够帮助您更好地理解这道题目,并在代码的世界中凌云飞舞,舞出不一样的风采!