zoukankan      html  css  js  c++  java
  • LeetCode算法题-Remove Duplicates from Sorted List

    这是悦乐书的第160次更新,第162篇原创

    01 前情回顾

    昨晚的爬楼梯算法题,有位朋友提了个思路,使用动态规划算法。介于篇幅问题,这里不细说动态规划算法,以后会在数据机构和算法的理论知识里细说。

    昨晚的三个解法中,根据测试数据和结果,第三种解法是最优的,但是还能不能更进一步呢?经过推导,我们得知当n大于等于3的时候,f(n) = f(n-1)+f(n-2),也就是说我们只需要得到n的前面两位的结果即可,对此我们使用了数组,将每个值都存起来了,最后取出数组中的最后一位元素。那么是否可以将数组也省掉,降低空间复杂度呢?答案是可以的,我们可以使用临时变量存值。

    public int climbStairs4(int n) {
        if (n == 0 || n == 1) {
            return 1;
        } 
        int a = 1;
        int b = 1;
        int temp = 0;
        for (int i=2; i<= n; i++) {
            temp = a + b;
            a = b;
            b = temp;
        }
        return temp;
    }
    

    02 看题和准备

    今天介绍的是LeetCode算法题中Easy级别的第19题(顺位题号是83)。给定已排序的链接列表,删除所有重复项,使每个元素只出现一次。例如:

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

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

    本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

    03 第一种解法

    特殊情况一:当head为空时,直接返回空。

    特殊情况二:当head没有下一个节点时,肯定是没有重复节点值的,直接返回head本身。

    正常情况:既然要判断节点值是否重复,免不了循环。另外,还要考虑是否要建一个新的链表来连接最后去重的节点值。

    首先,获取head的下一个节点值,判断head.val和head.next.val是否相等,如果相等,此时head节点的下一个节点应该跳到head.next.next这里,如果不相等,那么head节点的下一个节点只用跳到head.next即可,接着进入下一次判断。由此,我们可以直接使用head本身,只是需要重新改变它的节点连接对象,也就是它改变原本每个节点的引用,而不需要额外使用新的空间来存储去重后的链表。

    public ListNode deleteDuplicates(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }
        ListNode first = head;
        ListNode second = first.next;
        while (second != null) {
            if (first.val == second.val) {
                second = second.next;
                first.next = second;
            } else {
                first = first.next;
                second = second.next;
            }
        }
        return head;
    }
    

    04 小结

    去除链表的重复节点值和之前去除数组重复元素的题有点类似,关于链表的简单介绍在合并链表的题有讲过,可以找找之前的文章看看。

    以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

  • 相关阅读:
    深入理解类的填充规则
    深入理解C++虚函数表
    Java接入图灵机器人,实现与机器人聊天
    flex弹性布局学习笔记
    gulp插件gulp-usemin简单使用
    js基础知识温习:Javascript中如何模拟私有方法
    一次体验很不爽的面试经历
    JavaScript中in操作符(for..in)、Object.keys()和Object.getOwnPropertyNames()的区别
    js基础知识温习:构造函数与原型
    js基础知识温习:js中的对象
  • 原文地址:https://www.cnblogs.com/xiaochuan94/p/9899813.html
Copyright © 2011-2022 走看看