代码随想录算法训练营第四天 | 23.两两交换链表中的节点 19.删除链表的倒数第N个节点 链表相交 142.环形链表II

23.两两交换链表中的两个节点

题目链接 文章讲解 视频讲解

  • 时间复杂度 o(n)
  • 空间复杂度 o(1)

tips: 画图,并将每一步操作用伪代码写出来,然后将代码理顺可以避免修改代码的麻烦
初始化的时候就要将previous初始化为current的前一个节点,这样可以保证循环的第一步满足循环要求

class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        // 定义虚拟头节点
        ListNode * dummy = new ListNode();
        dummy->next = head;
        // 初始化current指向第一个节点也就是头节点,previous指向current的前一个节点
        ListNode * current = head, * previous = dummy;
        // 如果current不为空执行循环
        while(current) {
            // 定义一个节点保存带交换的两个节点的前一个节点
            ListNode * temp = previous;
            // previous指向带交换的两个节点中第一个节点
            previous = current;
            // 如果current的下一个节点不为空,那么current指向待交换的两个节点中第二个节点
            if(current->next) {
                current = current -> next;
                // 交换两个节点
                previous->next = current->next;
                current->next = previous;
                temp->next = current;
            } else {
                // 如果current的下一个节点为空那么只有一个待交换节点,此时返回
                return dummy->next;
            }
            // current指向下一组待交换的两个节点中的第一个节点
            current = previous->next;
        }
        return dummy->next;
    }
};

19.删除链表的倒数第N个节点

题目链接 文章讲解 视频讲解

  • 时间复杂度 o(n)
  • 空间复杂度 o(1)

tips: 这里再删除的时候不需要判断slow是否为空因为最开始的时候slow指向dummy,slow->next指向head,两者都不为空,在有fast作为先导的情况下,slow不可能为空,slow的next也不可能为空

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode * dummy = new ListNode;
        dummy->next = head;
        ListNode * fast = dummy;
        ListNode * slow = dummy;
        while(n-- && fast) fast = fast->next;
        while(fast->next) {       
            // 慢指针出发
            fast = fast->next;
            slow = slow->next;
        }

        ListNode *temp = slow->next;
        slow->next = slow->next->next;
        delete temp;
        
        return dummy->next;
    }
};

面试题02.07链表相交

题目链接 文章链接

  • 时间复杂度 o(n)
  • 空间复杂度 o(1)
class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        ListNode * curr_a = headA, * curr_b = headB;

        while(curr_a != curr_b) {
            if(curr_a) {
                curr_a = curr_a->next;
            } else {
                curr_a = headB;
            }
            if(curr_b) {
                curr_b = curr_b->next;
            } else {
                curr_b = headA;
            }
        }
        return curr_a;
    }
};

142.环形链表II

题目链接 文章讲解 视频讲解

  • 时间复杂度 o(n)
  • 空间复杂度 o(1)
class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        ListNode * fast = head, *slow = head;
        if(!head) return nullptr;
        while(fast->next) {
            fast = fast->next;
            if(fast->next) fast = fast->next;
            else return nullptr;
            slow = slow->next;
            if(slow == fast) break;
        }
        if(!fast->next) return nullptr;
        ListNode * current = head;
        while(current != fast) {
            current = current->next;
            fast = fast->next;
        }
        return fast;
    }
};
posted @ 2024-05-12 14:33  深蓝von  阅读(3)  评论(0编辑  收藏  举报