Leetcode P83 删除排序链表中的重复元素

Leetcode P83 删除排序链表中的重复元素

题目

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

示例 1:

输入: 1->1->2
输出: 1->2

示例 2:

输入: 1->1->2->3->3
输出: 1->2->3

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

双指针法

这道题还是很容易的,双指针法,和 Leetcode P26 删除排序数组中的重复项 一样的算法,只是把数组改成链表(甚至我还觉得更简单了?)

就搞两个指针 currenttoDelcurrent 遍历链表,维护 toDel 前的节点值不重复。直接上代码吧,Golang:

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func deleteDuplicates(head *ListNode) *ListNode {
    current := head
    toDel := head
    for current != nil {
        if current.Val != toDel.Val {
            toDel.Next = current
            toDel = current
        }
        current = current.Next
    }
    if toDel != nil && toDel.Next != nil && toDel.Next.Val == toDel.Val {
        toDel.Next = nil
    }
    return head
}

屏幕快照 2020-03-11 16.36.36

优化:单指针

这个题还可以只用一个指针完成,因为链表是用指针指下一个的嘛,我们可以方便地把任意节点的下一节点改成其后的某一节点,来达到“删除”中间的一些节点的目的。比如current.Next = current.Next.Next,就相当于把 current.Next 删除了。

用这个思路就可以用一个指针把链表中的重复元素删除:

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func deleteDuplicates(head *ListNode) *ListNode {
    current := head
    for (current != nil) && (current.Next != nil) {
        if current.Next.Val == current.Val {
            current.Next = current.Next.Next
        } else {
            current = current.Next
        }
    }
    return head
}

image-20200311170330484

哈哈,一开始我没写 else 分句,current = current.Next 写在外面,这么做是错的,如果输入是 [1,1,1,1],就会输出 [1,1],少了尾部最后的处理。然后我改这个的时候顺手把 for 条件里的 current != nil 也删了,但他有 [] 的输入,又错了一次🤦‍♂️


本文由 CDFMLR 原创,收录于个人主页 https://clownote.github.io,并同时发布到 CSDN。本人不保证 CSDN 排版正确,敬请访问 clownote 以获得良好的阅读体验。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值