#LeetCode每日一题【链表专题】
-
删除排序链表中的重复元素 II
https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list-ii/ -
分析
两种实现方式:迭代+递归
迭代:双指针
正常思路双指针:遇到一样的慢指针留下来作为标记,快指针向前走;
遇到不一样的,处理:将慢指针的上一个的next置为fast;;所以这里关键的要找到slow的上一个,巧妙的办法就是使用一个哑节点
使用第三个指针,初始时指向哑节点,然后随着slow前进,保持着在slow的前面一个;大体流程如上面所示,主要在最后需要处理下慢指针是否在最后一个的情况,在最后一个即末尾都不相同,不在最后一个即末尾都相同则需要特殊处理下
-
实现
public ListNode deleteDuplicates(ListNode head) {
if (head == null) {
return null;
}
ListNode tempNodeBegin = new ListNode(0, null);
// 加一个哑节点
tempNodeBegin.next = head;
ListNode slow = head, fast = head, slowTemp = tempNodeBegin;
while (fast != null) {
// 值相等,fast前进,slow留下来标记
if (slow.val != fast.val) {
// 不是紧挨着的
if (slow.next != fast) {
slowTemp.next = fast;
slow = fast;
} else {
slowTemp = slowTemp.next;
slow = slow.next;
}
}
fast = fast.next;
}
// slow与fast不紧挨着(即末尾都是一样的数)
if (slow.next != null) {
slowTemp.next = null;
}
return tempNodeBegin.next;
}
LeetCode耗时:0ms
- 实现二:递归
借鉴别人写的递归
/*
递归处理方式
*/
public ListNode deleteDuplicates02(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode next = head.next;
if (head.val == next.val) {
// 一直向下寻找,直到遇到不相等的val
while (next != null && head.val == next.val) {
next = next.next;
}
head = deleteDuplicates02(next);
} else {
ListNode node = deleteDuplicates02(next);
head.next = node;
}
return head;
}
LeetCode耗时:0ms
- 总结
关于递归:
递归之前的逻辑处理是为了处理传入的参数
递归之后的逻辑处理是为了处理最后的结果(有当前和上一步返回的结果)
递归三部曲:https://lyl0724.github.io/2020/01/25/1/