日新计划Leetcode之 83. 删除排序链表中的重复元素

86 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第2天,点击查看活动详情

一、题目描述:

83. 删除排序链表中的重复元素 - 力扣(LeetCode) (leetcode-cn.com)

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

示例 1: image.png

输入:head = [1,1,2]
输出:[1,2]

示例 2:

image.png

输入:head = [1,1,2,3,3]
输出:[1,2,3]

提示:

  • 链表中节点数目在范围 [0, 300] 内
  • -100 <= Node.val <= 100
  • 题目数据保证链表已经按升序 排列

二、思路分析:

一个快指针,一个慢指针; 快指针负责向前跑,找用来遍历后面的数字。

  • 如果快慢指针相等,那么继续往先跑

    提示:快慢指针相等时,慢指针的next要指向None!否则遇到全都相等的链表,会输出原始链表,鲁棒性就没了!

  • 如果不相等,那么慢指针的next指向当前快指针,并且在下一个循环之前更新快慢指针

    其中慢指针决定最后的输出结果

三、AC 代码:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next

class Solution:
    def deleteDuplicates(self, head: ListNode) -> ListNode:

        temp = head
        head_temp = head

        # 空
        if head_temp is None:
            return head_temp
        
        tn = temp.next
        if tn is None:  # 只有一个
            return head_temp  # 

        fast = head.next
        slow = head

        while fast:  # 最后确定边界条件
            if fast.val == slow.val:  # 相等
                fast = fast.next
                # 暂时掐断slow next, 且不更新slow
                slow.next = None

            else:  # 不相等
                slow.next = fast
                slow = fast
                fast = fast.next

        return head_temp

四、参考:

Rust 一次遍历,删除排序链表中的重复元素 - 删除排序链表中的重复元素 - 力扣(LeetCode)

【算法小菜鸡】【java】简单易懂说明 - 删除排序链表中的重复元素 - 力扣(LeetCode)