83. 删除排序链表中的重复元素|刷题打卡

97 阅读1分钟

掘金团队号上线,助你 Offer 临门! 点击 查看详情

一、题目描述:

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

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

示例 1:


输入:head = [1,1,2]
输出:[1,2]
示例 2:


输入:head = [1,1,2,3,3]
输出:[1,2,3]

提示:

链表中节点数目在范围 [0, 300] 内
-100 <= Node.val <= 100
题目数据保证链表已经按升序排列

二、思路分析:

  • 刚看到示例很像是数组去重,可是这是 ListNode,不是数组,前面已经遇到一个链表的问题,21.合并两个有序链表
  • 主要判断 ListNode的next 值是否存在,存在就变 ListNode的next

三、AC 代码

/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var deleteDuplicates = function(head) {
  if (!head) {
        return head;
    }

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

};
执行用时:120 ms
内存消耗:39.6 MB


四、总结

  • 当然不止一种方法,看到别人写的说明,这个理解起来更好;
// 链表为空时直接返回
   if(!head) return head;
   // 初始化两个指针
   let p1 = head;
   let p2 = head.next;
   // 指针p2为空时链表遍历结束 
   while(p2){
       // 当两个指针的值相同时
       if(p1.val===p2.val){
           // 将p1作为基准值,将它的next指向p2的下一个节点
           p1.next = p2.next;
       }else {
           // 两个指针的值不同时就证明前面已经没有相同的值了,就将p1更新为第一次出现的p2
           p1 = p2;
       }
      // 继续移动p2
       p2 = p2.next;
   }
  // 返回头节点,即时后面有重复的值,那头结点也会存在
   return head;


仅供学习参考

参考题目