83. 删除排序链表中的重复元素(2021-05-10)

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

链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list/

题目描述见链接内容。

解法1

又是一道关于链表的简单题目,但是我花了好长时间,反复调试才做出来,倒不是思路有多复杂,实际上思路比较简单,因为这个链表是升序的,所以只需要比较前后两个节点的值就可以,如果前后两个节点的值相同,就略过相同的节点,如果不相同的话,就为赋值给结果节点

思路很简单,但是我遇到的麻烦在于:

(1)如何正确的表示与返回链表

其实这个问题之前更加迷糊,现在我的经验是,链表的题目,要返回一个head(链表的起点),同时声明一个tail(链表的终点), head用已有链表的初值赋值,tail为空,随着遍历过程不断为tail更新值,同时通过tail = tail.next来将tail指针向后移动

(2)如何遍历链表

上面提到了,一般都是通过tail = tail.next这个形式来不断向后移动,对于这个题目需要有两个指针,原链表通过head = head.next来不断遍历,结果链表通过tail = tail.next更新

解决这两个问题,再注意一些细节就好,确实不难,单是又耗费了一两个小时才完成,还是太菜了

var deleteDuplicates = function (head) {
  if (!head) {
    return null;
  }
  let start = new ListNode(head.val);
  let tail = null;

  while (head) {
    const next = head.next;
    if (next) {
      if (next.val !== head.val) {
        if (!tail) {
          tail = new ListNode(next.val);
          start.next = tail;
        } else {
          tail.next = new ListNode(next.val);
          tail = tail.next;
        }
      }
    }
    head = head.next;
  }

  return start;
};
  • 时间复杂度:${O(N)}$
  • 空间复杂度:${O(1)}$
  • 执行用时:88ms, 在所有JavaScript提交中击败了94%的用户,内存消耗:39.7MB,在所有JavaScript提交中击败了54%的用户

解法2

看了官方题解,我觉得我怎么这么笨呢,其实只要生命一个cur指针就完事了,最后返回的就是传入的head

var deleteDuplicates = function (head) {
  if (!head) {
    return null;
  }

  let cur = head;

  while (cur.next) {
    if (cur.val === cur.next.val) {
      cur.next = cur.next.next;
    } else {
      cur = cur.next;
    }
  }

  return head;
};
  • 时间复杂度:${O(N)}$
  • 空间复杂度:${O(1)}$
  • 执行用时:88ms, 在所有JavaScript提交中击败了94%的用户,内存消耗:39.8MB,在所有JavaScript提交中击败了54%的用户

代码简洁的多

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值