[路飞]_LeetCode题83删除排序链表中的重复元素

130 阅读1分钟

题目描述

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

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

 

示例 1:

image.png

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

image.png

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

提示:

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

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/re… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解思路

定义两个指针pre(前指针)和cur(后指针)因为给定链表是升序链表,所以只要比较相邻两个节点的值是否相等,如果相等则让cur移动一步,直到cur与pre的值不相等,此时让pre指向cur即可删除重复的节点,当cur指向null时结束循环。此时让pre指向null即可。

题解代码

 * 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 null;
  let pre = head,cur = head.next;//定义两个指针,比较两个节点值是否相等
  
  //cur不为null则链表没有走完
  while(cur){
    //值不相等时,让pre指向cur,pre与cur向后移动一步
    if(cur.val !== pre.val){
      pre.next = cur;
      pre = cur;
      cur = cur.next;
    }else{
      cur = cur.next;//值相等时,只需要让cur向后移动一步,继续比较与pre的值
    }
  }

  //由于循环结束时cur指向的是null,pre指向的并不一定为空
  //因此需要将pre指向null结束链表
  pre.next = null;
  return head;
};