补 刷题 链表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;
    }
};
posted @ 2022-10-18 20:16  Nsf  阅读(23)  评论(0)    收藏  举报