LeetCode.83 删除排序链表中的重复元素

460 阅读2分钟

这是我参与8月更文挑战的第3天,活动详情查看:8月更文挑战

题目描述:

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

存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除所有重复的元素,使每个元素 只出现一次 。

返回同样按升序排列的结果链表。

示例一

image.png

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

示例二

image.png

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

提示:

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

思路分析

一次遍历

由于题目已经说明列表是一个升序的链表,所以重复的元素肯定是连续在一起的,我们只需要遍历一遍链表就能去除重复的元素。

步骤:

  • 定义一个指针cur指向head
  • 比较当前节点的值和下个节点的值,
    • 如果相同,cur节点指向下个节点的下个节点,这样cur的原下个节点就没有节点指向了,想当与去重了
    • 如果不同,cur后移一位继续循环

AC代码

class Solution {
    fun deleteDuplicates(head: ListNode?): ListNode? {
        // 虚拟头结点 dummy,使其指向 head,最终返回 dummy.next。注意:-100 <= Node.val <= 100
        val dummy = ListNode(-101)
        dummy.next = head
        var cur: ListNode? = dummy
        
        while (cur?.next != null) {
            if (cur?.`val` == cur?.next?.`val`) {
                // 跳过当前的重复节点,使得cur指向当前重复元素的最后一个位置
                cur?.next = cur?.next?.next
            } else {
                // 不重复,移到下一个位置
                cur = cur?.next
            }
        }
        return dummy.next
    }
    
}

总结

这个就是个简单的链表的题目,循环很容易就想到了,官解也是这个。 看评论区还有个递归的,下次试试。

参考

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

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