小题大做-删除排序链表中的重复元素

这是我7月12号写的,上周没偷懒,只是忘记发布了!!!

题干

给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。

刚看到这个题的时候,没有注意到该链表是排序链表,走了一些弯路,第一次提交如下

主副指针

首先声明两个指针,一个主指针,一个副指针,移动副指针,看主指针后面有没有与主指针重复的值,有的话,就跳过这个主指针,没有的话,将主指针的值放在新的链表的结尾,主指针移动时,记录每一次主指针的值,如果遇到已经有过的值,直接跳过
时间复杂度O(n^2)空间复杂度O(n)

var deleteDuplicates = function(head) {
    if (!head) return null
    let arr = [];
    let main = head;
    let assistant = head.next;
    let result
    let result_
    while (main) {
        if (arr.includes(main.val)) {
            main = main.next
        } else {
            arr.push(main.val);
            assistant = main.next;
            while (true) {
                if (!assistant) {
                    result ? (result.next = new ListNode(main.val), result = result.next) : (result = new ListNode(main.val), result_ = result)
                    break;
                } else if (assistant.val == main.val) {
                    break;
                } else {
                    assistant = assistant.next
                }
            }
            main = main.next
        }
    }
    return result_ ? result_ : null
};

双指针

两个指针,一主一副,
首先在链表最开头的位置,加一个节点,主指针为新头,副指针为主指针的下一个,比较副指针与副指针的下一位是否相同,如果不同,主副指针一起往后挪一位,如果相同,就后挪副指针,挪到副指针与下一位不同为止,然后指针next指向副指针的next。
时间复杂度O(n), 空间复杂度O(1)

var deleteDuplicates = function(head) {
    if (!head) return null;
    let newHead = new ListNode(0);
    newHead.next = head;
    let main = newHead;
    let sub = head;
    while (sub) {
        if (sub.next && sub.val == sub.next.val) {
            while (sub.next && sub.val == sub.next.val) {
                sub = sub.next;
            }
            main.next = sub.next;
            sub = sub.next;
        } else {
            main = main.next;
            sub = sub.next
        }
    }
    return newHead.next
};

转换为数组,去重,再转换回来

此方法会遍历三遍链表

var deleteDuplicates = function(head) {
    if (!head) return null;
    let arr = [];
    while (head) {
        arr.push(head.val);
        head = head.next;
    }
    arr = unique(arr);
    console.log(arr)
    let result
    let result_
    if (arr.length == 0) {
        return null
    } else {
        for (let i = 0; i < arr.length; i++) {
            if (i == 0) {
                result = new ListNode(arr[i])
                result_ = result
            } else {
                result.next = new ListNode(arr[i]);
                result = result.next
            }
        }
    }
    return result_
};

function unique(arr) {
    let result = [];
    for (let i = 0; i < arr.length; i++) {
        if (arr.indexOf(arr[i]) == arr.lastIndexOf(arr[i])) {
            result.push(arr[i])
        }
    }
    return result
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值