LeetCode 82.删除排序链表中的重复元素||
大家好,我是灵魂画师--茄子。技术水平一般,喜欢画画。
开始今天的正题。
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。
示例 1:
输入: 1->2->3->3->4->4->5
输出: 1->2->5
示例 2:
输入: 1->1->1->2->3
输出: 2->3
解法:
1.快慢指针解法
思路:
- 设立一个慢指针,设立一个快指针
- 快指针用来跳过重复数字,记录下一个不重复的节点位置
- 慢指针,标记重复数字前一个节点,用来跟快指针相连接
let deleteDuplicates = function(head) {
let dummyHead = new ListNode(); // 设置哨兵节点
dummyHead.next =head;
let slow = dummyHead; // 设置慢指针
let quick = head; // 设置快指针
while(quick){
if(quick.next && quick.val === quick.next.val){
// 如果值相同的话,保留这个值作为对比,让快指针前进
let val = quick.val;
console.log(val)
while(quick && val === quick.val){ // 这里注意边界条件的判断,当快指针前进到最后一个的时候是null
quick = quick.next
console.log('quick',quick)
}
} else{
// 如果值不相同的话,前进快慢指针
// 这里要注意,快慢指针可能存在不挨着的情况,所以需要指向一下slow.next
slow.next = quick;
slow = quick;
quick = quick.next;
}
}
slow.next = quick;
return dummyHead.next;
};
2.递归解法
思路:
- 判断当前递归项的终止条件(head == null)
- 判断head.next与head.next的下一项是否相同,如果相同的话让head = head.next
let deleteDuplicates = function(head) {
if(head == null){ // 递归的终止条件
return head;
}
if(head.next && head.val === head.next.val){
while(head.next && head.val === head.next.val){
head = head.next;
}
return deleteDuplicates(head.next); // 这句话很关键,传入的是head.next head的下一项,不是当前项,如果传入的是当前项的话,会导致1->2->3->3->5->NULL 变为 1->2->3->5->NULL
} else {
head.next = deleteDuplicates(head.next);
}
return head;
};
结合我的分析你是不是对这道题有了更清晰的认识了呢?
以上就是我的思路以及解法了,希望大家喜欢我画的图解,我会继续努力的ヾ(◍°∇°◍)ノ゙。(点个赞把我带走吧~~)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。