每日一解 简单题目移除重复节点

题目 移除重复节点

编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。

示例1:
输入:[1, 2, 3, 3, 2, 1]
输出:[1, 2, 3]

示例2:
输入:[1, 1, 1, 1, 2]
输出:[1, 2]

提示:
链表长度在[0, 20000]范围内。
链表元素在[0, 20000]范围内。

进阶:
如果不得使用临时缓冲区,该怎么解决?

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-duplicate-node-lcci

思路

这题毕竟是简单题目,思路很明确,采用哈希表解决重复问题,而且哈希表的查找时间为O(1),所以最终的时间复杂度只有遍历一遍数组的O(n)。个人的代码如下:

class Solution {
    
    
public:
	ListNode* removeDuplicateNodes(ListNode* head) {
    
    
		unordered_map<int, int> data;
		ListNode *curr = head, *last = head;
		if (head == NULL || head->next == NULL) {
    
    
			return head;
		}
		curr = curr->next;
		data.insert(pair<int, int>(last->val, last->val));
		while (curr != NULL) {
    
    
			if (data.find(curr->val) == data.end()) {
    
    
				data.insert(pair<int, int>(curr->val, curr->val));
				last->next = curr;
				last = curr;
			}
			curr = curr->next;
		}
		last->next = NULL;
		return head;
	}
};

最后,看了看官解和其他解答,没想到进阶问题根本没有比较出彩的思路,进阶问题只是个时间换空间,采用O(n^2)的暴力方法得到答案。也就是每个数字都遍历一遍之前得到的数组,检查是否已经出现过,仅此而已,没什么实际意义。

猜你喜欢

转载自blog.csdn.net/new_DYX/article/details/106965081
今日推荐