代码随想录day4

24.两两交换链表:注意虚拟头节点的使用

cpp 复制代码
ListNode* swapPairs(ListNode* head) {
        ListNode* dummy = new ListNode();
        dummy->next = head;
        ListNode* current = dummy;
        while(current->next != nullptr && current->next->next != nullptr){
            ListNode* tmp = current->next;
            ListNode* tmp1 = current->next->next->next;

            current->next = current->next->next;
            current->next->next = tmp;
            current->next->next->next = tmp1;
            current = current->next->next;
        }
        return dummy->next;
    }

19.删除链表中的倒数第N个结点:注意使用快慢指针,以及中间的间隔n的判断

cpp 复制代码
ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode* dummy = new ListNode();
        dummy->next = head;
        ListNode* fast = dummy;
        ListNode* slow = dummy;
        //先移动fast指针领先slow n+1 个位置
        while(n-- && fast != nullptr){
            fast = fast->next;
        }
        fast = fast->next;
        //同时移动fast,slow到fast抵达最后
        while(fast != nullptr){
            fast = fast->next;
            slow = slow->next;
        }
        //删除第N个需要用到的是第N-1个节点
        ListNode* tmp = slow->next;
        slow->next = tmp->next;
        delete(tmp);
        return dummy->next;
        
}

面试题02.07链表相交://理解链表相交不是值相等,而是指向同一块区域

cpp 复制代码
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        ListNode* listA = headA;
        ListNode* listB = headB;
        int lenA = 0, lenB = 0;
        while(listA != nullptr){
            listA = listA->next;
            lenA++;
        }
        
        while(listB != nullptr){
            listB = listB->next;
            lenB++;
        }
        if(lenB > lenA){
            swap(headA, headB);
            swap(lenA, lenB);
        }
        int gap = lenA - lenB;
        listA = headA;
        listB = headB;
        while(gap--){
            listA = listA->next;
        }
        while(listA != nullptr && listB != nullptr){
            if(listA == listB){
                return listA;
            }else{
                listA = listA->next;
                listB = listB->next;
            }
        }
        return nullptr;
    }

142.环形链表II://需理解为甚么fast比slow快1就能在环中相遇,什么时候fast追上slow,以及追上后如何获取环的入口位置

cpp 复制代码
ListNode *detectCycle(ListNode *head) {
        ListNode* fast = head;
        ListNode* slow = head;
        while(fast != nullptr && fast->next != nullptr){
            fast = fast->next->next;
            slow = slow->next;
            //找到fast与slow在环中的相遇点
            if(fast == slow){
                ListNode* left = head;
                ListNode* right = fast;
                while(left != nullptr && right != nullptr){
                    if(left == right){
                        return left;
                    }
                    left = left->next;
                    right = right->next;

                }
                
            }
            
        }
        return nullptr;
    }
相关推荐
元亓亓亓40 分钟前
LeetCode热题100--230. 二叉搜索树中第 K 小的元素--中等
算法·leetcode·职场和发展
草莓熊Lotso41 分钟前
《算法闯关指南:优选算法-双指针》--01移动零,02复写零
c语言·c++·经验分享·算法·leetcode
焜昱错眩..2 小时前
代码随想录算法训练营第三十九天|62.不同路径 63.不同路径ll
算法
ajassi20005 小时前
开源 C++ QT Widget 开发(十五)多媒体--音频播放
linux·c++·qt·开源
焦耳加热5 小时前
阿德莱德大学Nat. Commun.:盐模板策略实现废弃塑料到单原子催化剂的高值转化,推动环境与能源催化应用
人工智能·算法·机器学习·能源·材料工程
wan5555cn5 小时前
多张图片生成视频模型技术深度解析
人工智能·笔记·深度学习·算法·音视频
u6066 小时前
常用排序算法核心知识点梳理
算法·排序
鹅毛在路上了7 小时前
C++, ffmpeg, libavcodec-RTSP拉流,opencv实时预览
c++·opencv·ffmpeg
John_ToDebug7 小时前
定制 ResourceBundle 的实现与 DuiLib 思想在 Chromium 架构下的应用解析
c++·chrome·ui
蒋星熠8 小时前
Flutter跨平台工程实践与原理透视:从渲染引擎到高质产物
开发语言·python·算法·flutter·设计模式·性能优化·硬件工程