83. 删除排序链表中的重复元素
链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list/
题目描述见链接内容。
解法1
又是一道关于链表的简单题目,但是我花了好长时间,反复调试才做出来,倒不是思路有多复杂,实际上思路比较简单,因为这个链表是升序的,所以只需要比较前后两个节点的值就可以,如果前后两个节点的值相同,就略过相同的节点,如果不相同的话,就为赋值给结果节点
思路很简单,但是我遇到的麻烦在于:
(1)如何正确的表示与返回链表
其实这个问题之前更加迷糊,现在我的经验是,链表的题目,要返回一个head
(链表的起点),同时声明一个tail
(链表的终点), head
用已有链表的初值赋值,tail
为空,随着遍历过程不断为tail
更新值,同时通过tail = tail.next
来将tail
指针向后移动
(2)如何遍历链表
上面提到了,一般都是通过tail = tail.next
这个形式来不断向后移动,对于这个题目需要有两个指针,原链表通过head = head.next
来不断遍历,结果链表通过tail = tail.next
更新
解决这两个问题,再注意一些细节就好,确实不难,单是又耗费了一两个小时才完成,还是太菜了
var deleteDuplicates = function (head) {
if (!head) {
return null;
}
let start = new ListNode(head.val);
let tail = null;
while (head) {
const next = head.next;
if (next) {
if (next.val !== head.val) {
if (!tail) {
tail = new ListNode(next.val);
start.next = tail;
} else {
tail.next = new ListNode(next.val);
tail = tail.next;
}
}
}
head = head.next;
}
return start;
};
- 时间复杂度:
${O(N)}$
- 空间复杂度:
${O(1)}$
- 执行用时:88ms, 在所有JavaScript提交中击败了94%的用户,内存消耗:39.7MB,在所有JavaScript提交中击败了54%的用户
解法2
看了官方题解,我觉得我怎么这么笨呢,其实只要生命一个cur
指针就完事了,最后返回的就是传入的head
:
var deleteDuplicates = function (head) {
if (!head) {
return null;
}
let cur = head;
while (cur.next) {
if (cur.val === cur.next.val) {
cur.next = cur.next.next;
} else {
cur = cur.next;
}
}
return head;
};
- 时间复杂度:
${O(N)}$
- 空间复杂度:
${O(1)}$
- 执行用时:88ms, 在所有JavaScript提交中击败了94%的用户,内存消耗:39.8MB,在所有JavaScript提交中击败了54%的用户
代码简洁的多