【路飞】leetcode-83. 删除排序链表中的重复元素

122 阅读1分钟

加油 第 10、11 练 忙完一段时间今天继续算法练习

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

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

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

今天这道题目要简单的多

  • 给定的链表是按升序排列的链表,因此我们可以知道重复元素在链表中出现的位置是连续的
  • 如果当前节点cur与vur.next重复,那么cur.next = cur.next.next,否则cur = cur.next 继续循环
  • 循环条件:cur 和 cur.next 存在
var deleteDuplicates = function(head) {
    var cur = head;
    while(cur && cur.next) {
        if(cur.val == cur.next.val) {
            cur.next = cur.next.next;
        } else {
            cur = cur.next;
        }
    }
    return head;
};

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

题目描述:存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字。

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

比上一题要多一个注意点
只保留没有重复出现

  • 重复元素是连续的
  • cur.next 与 cur.next.next相同
  • 循环条件 cur、cur.next、cur.next.next存在
var deleteDuplicates = function (head) {
    if (!head) return null; 
    // 设置一个哑结点:头节点可能会有重复
    const dummy = new ListNode(0, head);
    let cur = dummy;
    // 当下一个节点存在,且删除节点后要链接的节点存在
    while (cur.next && cur.next.next) {
        // 如果节点值相等
        if (cur.next.val == cur.next.next.val) {
            // 记录相同的这个值
            const x = cur.next.val;
            // 下一个节点值仍相等
            while (cur.next && cur.next.val == x) {
                cur.next = cur.next.next;
            }
        } else {
            cur = cur.next;
        }
    }
    return dummy.next;
}