编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。
示例1:
输入:[1, 2, 3, 3, 2, 1]
输出:[1, 2, 3]
示例2:
输入:[1, 1, 1, 1, 2]
输出:[1, 2]
提示:
链表长度在[0, 20000]范围内。
链表元素在[0, 20000]范围内。
进阶:
如果不得使用临时缓冲区,该怎么解决?
方法一:
双重循环。定义两个指针,i, j 用来控制循环,还需要一个指针pre用于删除重复节点。
代码:
class Solution {
public ListNode removeDuplicateNodes(ListNode head) {
// i j 双重循环
if (head == null) return head;
ListNode i = head, pre = i, j = pre.next;
while (i.next != null) {
while (j != null) {
if (j.val == i.val) {
ListNode delNode = j;
pre.next = delNode.next;
j = pre.next;
} else {
pre = pre.next;
j = pre.next;
}
}
i = i.next;
if (i == null) break;
pre = i;
if (pre != null) {
j = pre.next;
} else {
j = null;
}
}
return head;
}
}
时间复杂度:O(n2)
空间复杂度:O(1)
更好的解法待续…