LeetCode82 删除排序链表中的重复元素 II(思维)

tech2025-03-06  7

题目链接:leetcode82

题目大意

给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。 示例一: 输入: 1->2->3->3->4->4->5 输出: 1->2->5 示例二: 输入: 1->1->1->2->3 输出: 2->3

简而言之就是删掉原始序列中,所有出现次数大于1的元素。

解题思路

直接删除

AC 的代码就是这个方法,但逻辑可能略显冗余。先建一个头节点使链表变成带头节点的单链表。然后就是p、q两个指针分别表示相邻两种元素,如果发现靠后的指针的下一个节点有重复,那么就一直删掉,最后一个元素最后特判删除。

时间复杂度 O ( n ) O(n) O(n), 空间复杂度 O ( 1 ) O(1) O(1)

代码实现

/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* deleteDuplicates(ListNode* head) { ListNode *q, *p, *h = new ListNode(0); bool flag; h->next = head; q = h; p = head; while (p && p->next) { flag = true; while (p->next && p->val == p->next->val) { p = p->next; delete q->next; q->next = p; flag = false; } if (flag) { q = p; p = p->next; } else { p = p->next; delete q->next; q->next = p; } } return h->next; } };
最新回复(0)