🚩传送门:牛客题目

题目

存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除所有重复的元素,使每个元素 只出现一次
返回同样按升序排列的结果链表。
示例 1:
[NC]24. 删除有序链表中重复的元素 - 图1

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

示例 2:
[NC]24. 删除有序链表中重复的元素 - 图2

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

解题思路:一次遍历

具体地,我们从指针 cur 指向链表的头节点,随后开始对链表进行遍历。

  • 如果当前 curcur.next 对应的元素相同,那么我们就将 cur.next 从链表中移除;
  • 否则说明链表中已经不存在其它与 cur 对应的元素相同的节点,因此可以将 cur 指向 cur.next

当遍历完整个链表之后,我们返回链表的头节点即可。

复杂度分析

时间复杂度: [NC]24. 删除有序链表中重复的元素 - 图3 ,其中 [NC]24. 删除有序链表中重复的元素 - 图4 是链表的长度。

空间复杂度:[NC]24. 删除有序链表中重复的元素 - 图5

我的代码

  1. public ListNode deleteDuplicates(ListNode head) {
  2. if(head==null)return head;
  3. ListNode cur=head;
  4. ListNode next=head.next;
  5. while(next!=null){
  6. //1. 如果相等删除next结点
  7. if(cur.val==next.val){
  8. cur.next=next.next;
  9. next=next.next;
  10. }else{
  11. cur=next;
  12. next=next.next;
  13. }
  14. }
  15. return head;
  16. }

官方代码

public ListNode deleteDuplicates(ListNode head) {
    if (head == null) return head;
    ListNode cur = head;
    while (cur.next != null) {
        if (cur.val == cur.next.val) 
            cur.next = cur.next.next;
        else 
            cur = cur.next;
    }
    return head;
}