Leetcode--083-删除排序链表中的重复元素I

Leetcode–083-删除排序链表中的重复元素

题目描述

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

mark

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

mark

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

提示:

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

算法与思路

  • 由于给定的链表是排好序的,因此重复的元素在链表中出现的位置是连续的,因此我们只需要对链表进行一次遍历,就可以删除重复的元素。
  • 具体地,从指针cur 指向链表的头节点,随后开始对链表进行遍历
    • 如果当前的curcur.next对应元素相同,那么我们就将cur.next 从链表中移除;
    • 否则说明链表中已经不存在其它与cur对应元素相同的节点,因此可以将cur 指向 cur.next
  • 当遍历完整个链表之后,返回链表的头节点即可。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode deleteDuplicates(ListNode head) {
// 1. 特判
if(head == null){
return head;
}

// 2. 处理逻辑
ListNode cur = head; // cur 指向头节点
while(cur.next != null){ // 遍历一次链表
if(cur.val == cur.next.val){ // 如果相邻的链表节点是重复的
cur.next = cur.next.next; // 跳过这个节点
}else{
cur = cur.next; // 否则cur向前移动一位
}
}
return head;
}
}

复杂度分析

  • 时间复杂度:O(n) 遍历一次链表所花费的时间
  • 空间复杂度:O(1)
打赏
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!
  • © 2019-2022 Zhuuu
  • PV: UV:

请我喝杯咖啡吧~

支付宝
微信