代码随想录算法训练营第四天【链表part02】 | 24. 两两交换链表中的节点、19. 删除链表的倒数第N个节点 、面试题 02.07. 链表相交、142. 环形链表II

24. 两两交换链表中的节点

题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

求解思路:

代码随想录算法训练营第四天【链表part02】 | 24. 两两交换链表中的节点、19. 删除链表的倒数第N个节点 、面试题 02.07. 链表相交、142. 环形链表II_第1张图片

代码:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        ListNode* dummyHead = new ListNode(0);
        dummyHead->next = head;
        ListNode* cur = dummyHead;
        while (cur->next != nullptr && cur->next->next != nullptr){
            ListNode* temp = cur->next;
            ListNode* temp1 = cur->next->next->next;
            //交换节点
            cur->next = cur->next->next;
            cur->next->next = temp;
            temp->next = temp1;
            //cur后移两位
            cur = cur->next->next;
        }
        return dummyHead->next;
    }
};

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

题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

求解思路:

代码随想录算法训练营第四天【链表part02】 | 24. 两两交换链表中的节点、19. 删除链表的倒数第N个节点 、面试题 02.07. 链表相交、142. 环形链表II_第2张图片

代码:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode* dummyHead = new ListNode(0);
        dummyHead->next = head;
        ListNode* fast = dummyHead;
        ListNode* slow = dummyHead;
        //fast后移n个位置
        while (n--){
            fast = fast->next;
        }
        //fast多走一步
        fast = fast->next;
        //fast和slow同时后移
        while (fast != nullptr){
            fast = fast->next;
            slow = slow->next;
        }
        //删除操作
        ListNode* temp = slow->next;
        slow->next = temp->next;
        delete temp;
        return dummyHead->next;
    }
};

面试题 02.07. 链表相交

题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

求解思路:

代码随想录算法训练营第四天【链表part02】 | 24. 两两交换链表中的节点、19. 删除链表的倒数第N个节点 、面试题 02.07. 链表相交、142. 环形链表II_第3张图片

代码:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        ListNode* A = headA;
        ListNode* B = headB;
        if (headA == nullptr || headB == nullptr) return nullptr;
        while (A != B){
            if (A == nullptr)
                A = headB;
            else 
                A = A->next;
            if (B == nullptr)
                B = headA;
            else
                B = B->next;
        }
        return A;
    }
};

142. 环形链表II

题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

求解思路:​​​​​​

代码随想录算法训练营第四天【链表part02】 | 24. 两两交换链表中的节点、19. 删除链表的倒数第N个节点 、面试题 02.07. 链表相交、142. 环形链表II_第4张图片

代码:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        ListNode* fast = head;
        ListNode* slow = head;
        ListNode* temp = head;
        //快慢指针同时移动,直到相遇
        while (true){
            if (fast == nullptr || fast->next == nullptr) return nullptr;
            fast = fast->next->next;
            slow = slow->next;
            if (fast == slow) break;
        }
        //head出发和快慢指针相遇点出发,最终在入口汇合
        while (temp != slow){
            temp = temp->next;
            slow = slow->next;
        }
        return temp;
    }
};

你可能感兴趣的:(算法训练,算法,链表,面试)