这是我7月12号写的,上周没偷懒,只是忘记发布了!!!
题干
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。
刚看到这个题的时候,没有注意到该链表是排序链表,走了一些弯路,第一次提交如下
主副指针
首先声明两个指针,一个主指针,一个副指针,移动副指针,看主指针后面有没有与主指针重复的值,有的话,就跳过这个主指针,没有的话,将主指针的值放在新的链表的结尾,主指针移动时,记录每一次主指针的值,如果遇到已经有过的值,直接跳过
时间复杂度O(n^2)空间复杂度O(n)
var deleteDuplicates = function(head) {
if (!head) return null
let arr = [];
let main = head;
let assistant = head.next;
let result
let result_
while (main) {
if (arr.includes(main.val)) {
main = main.next
} else {
arr.push(main.val);
assistant = main.next;
while (true) {
if (!assistant) {
result ? (result.next = new ListNode(main.val), result = result.next) : (result = new ListNode(main.val), result_ = result)
break;
} else if (assistant.val == main.val) {
break;
} else {
assistant = assistant.next
}
}
main = main.next
}
}
return result_ ? result_ : null
};
双指针
两个指针,一主一副,
首先在链表最开头的位置,加一个节点,主指针为新头,副指针为主指针的下一个,比较副指针与副指针的下一位是否相同,如果不同,主副指针一起往后挪一位,如果相同,就后挪副指针,挪到副指针与下一位不同为止,然后指针next指向副指针的next。
时间复杂度O(n), 空间复杂度O(1)
var deleteDuplicates = function(head) {
if (!head) return null;
let newHead = new ListNode(0);
newHead.next = head;
let main = newHead;
let sub = head;
while (sub) {
if (sub.next && sub.val == sub.next.val) {
while (sub.next && sub.val == sub.next.val) {
sub = sub.next;
}
main.next = sub.next;
sub = sub.next;
} else {
main = main.next;
sub = sub.next
}
}
return newHead.next
};
转换为数组,去重,再转换回来
此方法会遍历三遍链表
var deleteDuplicates = function(head) {
if (!head) return null;
let arr = [];
while (head) {
arr.push(head.val);
head = head.next;
}
arr = unique(arr);
console.log(arr)
let result
let result_
if (arr.length == 0) {
return null
} else {
for (let i = 0; i < arr.length; i++) {
if (i == 0) {
result = new ListNode(arr[i])
result_ = result
} else {
result.next = new ListNode(arr[i]);
result = result.next
}
}
}
return result_
};
function unique(arr) {
let result = [];
for (let i = 0; i < arr.length; i++) {
if (arr.indexOf(arr[i]) == arr.lastIndexOf(arr[i])) {
result.push(arr[i])
}
}
return result
}