c++算法进阶删除有序链表中的重复元素
作者:吴尼玛
这篇文章主要为大家介绍了c++算法进阶删除有序链表中的重复元素示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
题目
给出一个升序排序的链表,删除链表中的所有重复出现的元素,只保留原链表中只出现一次的元素。
例如:
给出的链表为1→2→3→3→4→4→5, 返回1→2→5。
给出的链表为1→1→1→2→3, 返回2→3。
数据范围:链表长度0≤n≤10000,链表中的值满足∣val∣≤1000
要求:空间复杂度O(n),时间复杂度O(n)
进阶:空间复杂度O(1),时间复杂度O(n)
示例
示例1
输入: {1,2,2} 返回值: {1}
示例2
输入: {} 返回值: {}
思路
因为是升序的链表,重复的元素时连在一起的,所以可以连续的跳过相同的节点。
这里有个小技巧:因为链表有可能前几个元素就是重复的,这时就需要删除头指针了,所以我们需要给链表增加一个自定义的表头,以方便后面删除了原来的头指针而找不到表头,还有需要注意的就是在返回的时候要去掉增加的表头。
这种解法的空间复杂度是O(1),另外也可以通过哈希表unordered_map来记录每个节点值出现的次数来解决这个问题。哈希表的方式空间复杂度就是O(n)了,如果链表的无序的,则哈希表的解决方法更通用。
解答代码
/** * struct ListNode { * int val; * struct ListNode *next; * ListNode(int x) : val(x), next(nullptr) {} * }; */ class Solution { public: /** * @param head ListNode类 * @return ListNode类 */ ListNode* deleteDuplicates(ListNode* head) { // write code here if (head == nullptr) { return nullptr; } // 给链表增加一个表头,以便可以删除原链表的头结点。 auto res = new ListNode(0); res->next = head; auto cur = res; while (cur->next != nullptr && cur->next->next != nullptr) { if (cur->next->val == cur->next->next->val) { int val = cur->next->val; // 跳过所有相同的值 while (cur->next != nullptr && cur->next->val == val) { cur->next = cur->next->next; } } else { cur = cur->next; } } // 返回值需要去掉增加的表头 return res->next; } };
以上就是c++算法进阶删除有序链表中的重复元素的详细内容,更多关于c++删除有序链表重复元素的资料请关注脚本之家其它相关文章!