【每日算法】LeetCode 83 —— 删除排序链表中的重复元素(一百七十五)

题目内容

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

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

示例

示例 1:

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

示例 2:

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

提示

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

题解

本题考查线性扫描。首先,定义一个cur节点用于表示“新”链表的最后一个节点,然后定义一个扫描节点p。p每向后移动一个节点,判断节点值与cur的值的大小关系,如果一致,则让p继续移动,直到不一致时,让cur->next指向p,然后更新cur和p两个节点,依次循环直到结束。

代码

/**
* 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 head;
auto cur = head;//表示新链表的最后一个节点
for(auto p = head -> next; p; p = p -> next){
if(cur -> val != p -> val){
// cur = cur -> next = p;
cur -> next = p;
cur = cur -> next;
}
}
cur -> next = NULL;
return head;
}
};
Author: Frederic Niu
Link: https://www.fredericniu.cn/2021/06/19/【每日算法】LeetCode-83-——-删除排序链表中的重复元素(一百七十五)/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
我的公众号