Juntao
Published on 2022-10-29 / 296 Visits
0

算法训练营Day 4

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

题目链接:https://leetcode.cn/problems/swap-nodes-in-pairs/
文章讲解:https://programmercarl.com/0024.%E4%B8%A4%E4%B8%A4%E4%BA%A4%E6%8D%A2%E9%93%BE%E8%A1%A8%E4%B8%AD%E7%9A%84%E8%8A%82%E7%82%B9.html#_24-%E4%B8%A4%E4%B8%A4%E4%BA%A4%E6%8D%A2%E9%93%BE%E8%A1%A8%E4%B8%AD%E7%9A%84%E8%8A%82%E7%82%B9
视频讲解:https://www.bilibili.com/video/BV1YT411g7br

考察点:链表基础, 这题很简单

class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        ListNode* dummyHead = new ListNode();
        dummyHead->next = head;
        ListNode* cur = dummyHead;
        ListNode* a = nullptr;
        ListNode* b = nullptr;
        while(cur->next!=nullptr && cur->next->next!=nullptr){
            a = cur->next;
            b = a->next;
            a->next = b->next;
            b->next = a;
            cur->next = b;
	    # 跳转两个节点
            cur = a;
        }
        return dummyHead->next;
    }
};

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

题目链接:https://leetcode.cn/problems/remove-nth-node-from-end-of-list/submissions/
文章讲解:https://programmercarl.com/0019.%E5%88%A0%E9%99%A4%E9%93%BE%E8%A1%A8%E7%9A%84%E5%80%92%E6%95%B0%E7%AC%ACN%E4%B8%AA%E8%8A%82%E7%82%B9.html#_19-%E5%88%A0%E9%99%A4%E9%93%BE%E8%A1%A8%E7%9A%84%E5%80%92%E6%95%B0%E7%AC%ACn%E4%B8%AA%E8%8A%82%E7%82%B9
视频讲解:https://www.bilibili.com/video/BV1vW4y1U7Gf

考察点:链表基础,双指针

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode* dummyHead = new ListNode();
        dummyHead->next = head;
        
        ListNode* left = dummyHead;
        ListNode* right = dummyHead;

        for(int i=0; i<n; i++){
            right = right->next;
        }
        while(right->next!=nullptr){
            left = left->next;
            right = right->next;
        }
        
        ListNode* tmp = left->next;
        left->next = tmp->next;
        delete tmp;
        return dummyHead->next;
    }
};

160.链表相交
题目链接:https://leetcode.cn/problems/intersection-of-two-linked-lists-lcci/submissions/
文章讲解:https://programmercarl.com/%E9%9D%A2%E8%AF%95%E9%A2%9802.07.%E9%93%BE%E8%A1%A8%E7%9B%B8%E4%BA%A4.html#%E6%80%9D%E8%B7%AF

考察点:链表基础

先遍历计算长度,因为重合部分长度相同,故将长链先移动至剩余部分和短链相等。

class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        ListNode* dummyHeadA = new ListNode();
        dummyHeadA->next = headA;
        ListNode* dummyHeadB = new ListNode();
        dummyHeadB->next = headB;

        ListNode* curA = dummyHeadA;
        ListNode* curB = dummyHeadB;
        int a = 0;
        int b = 0;
        int diff = 0;

        while(curA!=nullptr){
            curA= curA->next;
            a++;
        }

        while(curB!=nullptr){
            curB = curB->next;
            b++;
        }

        if(a>b){
            diff = a-b;
            curA = dummyHeadA;
            curB = dummyHeadB;
        }else{
            diff = b-a;
            curA = dummyHeadB;
            curB = dummyHeadA;
        }

        while(diff--){
            curA = curA->next;
        }

        while(curA!=nullptr){
            if(curA==curB){
                return curA;
            }
            curA = curA->next;
            curB = curB->next;
        }
        
        return nullptr;
    }
};
  1. 两两交换链表中的节点

题目链接:https://leetcode.cn/problems/linked-list-cycle-ii/
文章讲解:https://programmercarl.com/0142.%E7%8E%AF%E5%BD%A2%E9%93%BE%E8%A1%A8II.html#%E6%80%9D%E8%B7%AF
视频讲解:https://www.bilibili.com/video/BV1if4y1d7ob

考察点:本提较难,先判断有无交点,在通过一点点数学技巧计算出交点位置。

class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        ListNode* dummyHead = new ListNode();
        dummyHead->next = head;
        ListNode* left = dummyHead;
        ListNode* right = dummyHead;
        while(right!=nullptr&&right->next!=nullptr){
            left=left->next;
            right=right->next->next;
            if(left==right){
                left=dummyHead;
                while(left!=right){
                    left=left->next;
                    right=right->next;
                }
                return left;
            }
        }
        return nullptr;
    }
};