补 刷题 链表3
代码随想录
LeetCode 82. 删除排序链表中的重复元素 II
链表 #双指针 #递归
思路
方法一:双指针法
- 类似滑动窗口,快慢指针的移动时机
方法二:递归法 - 迭代是不断更新双指针,递归是不断更新链表,大链表化小链表
- 递归的调用时机
细节
// 双指针法略
// 递归法
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if(head == nullptr || head->next == nullptr){
return head;
}
ListNode* cur = head->next;
while(cur && cur->val == head->val){
cur = cur->next;
}
if(head->next != cur){
return deleteDuplicates(cur);
}
head->next = deleteDuplicates(cur);
return head;
}
};
LeetCode 328. 奇偶链表
链表 #双指针 #递归
思路
方法一:迭代
- 双指针,过程模拟,分成两个链表,再合并
方法二:递归法 - 仅头节点不足以将小链表拼合成大链表,因此不能原地递归,需要多参数递归函数
- 由于本题要求$O(1)$时间复杂度,因此递归并不适合
细节
// 迭代
class Solution {
public:
ListNode* oddEvenList(ListNode* head) {
if(head == nullptr){
return head;
}
ListNode* pre = head;
ListNode* cur = head->next;
ListNode* even_head = cur;
while(cur && cur->next){
pre->next = cur->next;
cur->next = cur->next->next;
pre = pre->next;
cur = cur->next;
}
pre->next = even_head;
return head;
}
};