Leetcode-83.删除链表重复元素——双指针cpp

Wain ... 2022-5-12 Algorithm
  • Leetcode
  • 双指针
About 1 min

# Leetcode-83.删除链表重复元素——双指针cpp

# 题目描述

给定一个已排序的链表的头head,删除所有重复的元素,使每个元素只出现一次。返回已排序的链表。

题目链接——83.删除链表重复元素 (opens new window)

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

提示

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

# 解题思路

这一题依然是链表删除元素类型的题目,也仍然能用双指针来做。思路也很简单,一个指针向前探路,遇到跟慢指针不同的值就接过去,最后慢指针连接一下NULL就行。

这题还有一个点需要注意,删除节点后,这些节点按理会悬空,没有真正释放。对于有垃圾自动回收的语言,那还可以不管。但是像cpp这种,可能还得释放一下。我找了一下评论,释放的代码如下:

if (pi->val == pi->next->val) {
    ListNode *del = pi->next;
    pi->next = pi->next->next;
    delete del;
}
1
2
3
4
5

但是delete也不是随便能用的,只能释放堆内存对象,对栈内存对象不管用。不过很多时候都是处理堆内存对象,包括本题也是能用的。

# 代码

/**

 \* Definition for singly-linked list.
 \* struct ListNode {
 \*   int val;
 \*   ListNode *next;
 \*   ListNode() : val(0), next(nullptr) {}
 \*   ListNode(int x) : val(x), next(nullptr) {}
 \*   ListNode(int x, ListNode *next) : val(x), next(next) {}
 \* };
 */

class Solution {

public:

  ListNode* deleteDuplicates(ListNode* head) {
    if(!head)
      return NULL;
    ListNode* first = head;
    ListNode* last = head;
    
    while(true){
      first = first->next;      
      if(!first){
        last->next = NULL;
        break; 
      }    
      if(first->val != last->val){
        last->next = first;
        last = last->next;
      }
    }
    return head;
  }
};
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
30
31
32
33
34
35
36
Last update: May 12, 2022 15:22