一、题目
编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。
示例1:
输入:[1, 2, 3, 3, 2, 1]
输出:[1, 2, 3]
示例2:
输入:[1, 1, 1, 1, 2]
输出:[1, 2]
提示:
- 链表长度在[0, 20000]范围内。
- 链表元素在[0, 20000]范围内。
进阶:
- 如果不得使用临时缓冲区,该怎么解决?
二、C# 题解
使用哈希表记录出现的数字,只需要一次遍历即可:
public class Solution { public ListNode RemoveDuplicateNodes(ListNode head) { Dictionary<int, bool> map = new Dictionary<int, bool>(); ListNode p = head, q; // 双指针,q 指向 p 的后一个元素 while (p != null) { map[p.val] = true; // 记录 p 指向的元素 q = p.next; // 更新 q if (q == null) break; int v = q.val; // 取出 p 指向的元素值 // 依据 v 对 p 进行操作 if (map.ContainsKey(v)) p.next = q.next; // 重复值,则跳过 q else p = q; // 非重复值,p 挪下一位 } return head; }}
- 时间复杂度: O(n) O(n) O(n)。
- 空间复杂度: O(n) O(n) O(n)。
如果不使用临时缓冲区,则需要每个元素依次检查,进行多次遍历:
public class Solution { public ListNode RemoveDuplicateNodes(ListNode head) { ListNode p = head, q; // 双指针 while (p != null) { int v = p.val; // 取出 p 指向元素的值 q = p; // q = p 代替 p进行遍历 // 出现 v 则删,否则跳到下一个 while (q.next != null) { if (q.next.val == v) q.next = q.next.next; else q = q.next; } p = p.next; // 更新 p } return head; }}
- 时间复杂度: O( n 2 ) O(n^2) O(n2)。
- 空间复杂度: O(1) O(1) O(1)。
来源地址:https://blog.csdn.net/zheliku/article/details/132506962