[算法]【刷题笔记】链表专题

每日微软面试题——day 5 题:两个链表,一升一降。合并为一个升序链表。 分析:(假设升序的链表为链表1,降序的链表为链表2,p1,p2分别作为它们的迭代器,还有一个合并链表用于存放合并后的数据) 法一、最容易想到的且容易实现的就是使两个表都变成升序,然后就是经典的合并排序算法的步骤了,步骤是构建p1, 阅读详情

必备知识

链表是一种兼具递归和迭代性质的数据结构,常用技巧:双指针中的快慢指针。

一、合并两个有序链表(虚拟头结点)

/**

 * Definition for singly-linked list.

 * public class ListNode {

 *     int val;

 *     ListNode next;

 *     ListNode() {}

 *     ListNode(int val) { this.val = val; }

 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }

 * }

 */

class Solution {

    public ListNode mergeTwoLists(ListNod

e list1, ListNode list2) {

        ListNode result = new ListNode();// 使用虚拟头结点:第一个节点为空,从第二个节点开始才是想要的

        ListNode p = result;

        ListNode p1 = list1,p2 = list2;

        while(p1 != null && p2!=null) {

            if(p1.val > p2.val) {

                p.next = p2;

                p2 = p2.next;

            } else {

                p.next = p1;

                p1 = p1.next;

            }

            p = p.next;

        }

        while(p1 != null) {

            p.next = p1;

            p1 = p1.next;

            p = p.next;

        }

        while (p2 != null) {

            p.next = p2;

            p2= p2.next;

            p = p.next;

        }

        return result.next;

    }

}

解题思路:

合并两个单链表:

1.使用双指针循环遍历,两个单链表同时遍历比较;然后移动指针

2.两个单链表同时遍历完后,最多会剩下一个单链表还有值,需要将剩下的也合并。

3.两个单链表都需要判断一下是否为空,不空就合并,最后返回合并后的链表

4.可以使用虚拟头结点进行辅助

二、合并K个有序链表(虚拟头结点和二叉堆)

/**

 * Definition for singly-linked list.

 * public class ListNode {

 *     int val;

 *     ListNode next;

 *     ListNode() {}

 *     ListNode(int val) { this.val = val; }

 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }

 * }

 */

class Solution {

    public ListNode mergeKLists(ListNode[] lists) {

        ListNode result = new ListNode();

        ListNode temp = result;

        if(lists.length == 0) {

            return null;

        }

        PriorityQueue<ListNode> minHead = new PriorityQueue<>(lists.length, Comparator.comparingInt(o -> o.val));

        for (ListNode node: lists

             ) {

            if (node != null){

                minHead.offer(node);

            }

        }

        while (!minHead.isEmpty()) {

            ListNode node = minHead.poll();

            temp.next = node;

            if (node.next != null) {

                minHead.offer(node.next);

            }

            temp = temp.next;

        }

        return result.next;

    }

}

解题思路:

  1. 分析题目,合并K个有序的链表,则需要找出这K个链表中最小的那个节点,使用优先队列-二叉堆-最小堆得特性,辅助
  2. 创建一个虚机头结点的结果链表
  3. 遍历将K个链表先放进优先队列中,因为是有序的,则第一批放进去的肯定存在最小的节点
  4. 再一个个出队列,第一个出队的就是最小,将最小的节点放到结果链表中,然后再将最小节点的下一个节点放进优先队列中进行排序
  5. 最后将一个个出队,放到结果链表,返回即可。

三、删除链表中倒数第N个结点(同步双指针)

/**

 * Definition for singly-linked list.

 * public class ListNode {

 *     int val;

 *     ListNode next;

 *     ListNode() {}

 *     ListNode(int val) { this.val = val; }

 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }

 * }

 */

class Solution {

    public ListNode removeNthFromEnd(ListNode head, int n) {

        ListNode result = new ListNode(-1);

        ListNode dump = result;

        ListNode p1 = head;

        for(int i =0; i< n; i++) {

           p1 = p1.next;

        }

        ListNode p2 = head;

        while(p1 != null) {

            result.next = p2;

            p2 = p2.next;

            result = result.next;

            p1 = p1.next;                      

        }

        result.next = p2.next;

        return dump.next;

    }

}

  解题思路:

寻找第k个节点解题思路:使用双指针

// 返回链表的倒数第 k 个节点

ListNode findFromEnd(ListNode head, int k) {

    ListNode p1 = head;

    // p1 先走 k 步

    for (int i = 0; i < k; i++) {

        p1 = p1.next;

    }

    ListNode p2 = head;

    // p1 和 p2 同时走 n - k 步

    while (p1 != null) {

        p2 = p2.next;

        p1 = p1.next;

    }

    // p2 现在指向第 n - k 个节点

    return p2;

}

四、返回链表中的中间结点(快慢双指针)

/**

 * Definition for singly-linked list.

 * public class ListNode {

 *     int val;

 *     ListNode next;

 *     ListNode() {}

 *     ListNode(int val) { this.val = val; }

 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }

 * }

 */

class Solution {

    public ListNode middleNode(ListNode head) {

        ListNode show = head;

        ListNode fast = head;

        while(show !=null && fast !=null && fast.next !=null) {

            show = show.next;

            fast = fast.next.next;

        }

        return show;

    }

}

  解题思路:

  如果知道链表的长度N,即可返回其中间结点了,问题在于长度N未知,如何一次遍历寻找其长度。

使用快慢指针,快指针每次走两步,慢指针每次走一步,快慢刚好相差两倍,当快指针走到最后时,慢指针刚好走到中间

五、有环的链表

1.判断链表是否有环(使用快慢双指针)

/**

 * Definition for singly-linked list.

 * class ListNode {

 *     int val;

 *     ListNode next;

 *     ListNode(int x) {

 *         val = x;

 *         next = null;

 *     }

 * }

 */

public class Solution {

    public boolean hasCycle(ListNode head) {

        ListNode fast = head;

        ListNode show = head;

        while (show != null && fast != null && fast.next != null) {

            fast = fast.next.next;

            show = show.next;

            if (fast == show) {

                return true;

            }

        }

        return false;

    }

}

解题思路:

使用快慢双指针,如果有环,则快慢指针一定相遇(即相等)则是有环,如果最后是null则没有环

2.返回有环链表的起点(先使用快慢双指针找到环,再使用同步双指针找到相遇点)

/**

 * Definition for singly-linked list.

 * class ListNode {

 *     int val;

 *     ListNode next;

 *     ListNode(int x) {

 *         val = x;

 *         next = null;

 *     }

 * }

 */

public class Solution {

    public ListNode detectCycle(ListNode head) {

        ListNode fast = head;

        ListNode show = head;

        while(show != null && fast !=null && fast.next != null) {

            show = show.next;

            fast = fast.next.next;

            if (show == fast) {

                break;

            }

        }

        if(fast == null || fast.next == null) {

            return null;

        }

        show = head;

        while(show != fast) {

            show = show.next;

            fast = fast.next;

        }

        return show;

    }

}

解题思路:

1.先使用快指针找到是否有环,并知道所在环的路径

2.然后快指针在成环的位置上,慢指针在起点,同时移动指针,如果再次相遇即是,入环的第一个起点了

六、相交链表

/**

 * Definition for singly-linked list.

 * public class ListNode {

 *     int val;

 *     ListNode next;

 *     ListNode(int x) {

 *         val = x;

 *         next = null;

 *     }

 * }

 */

public class Solution {

    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {

        ListNode one = headA;

        ListNode two = headB;

        while (one != two) {

            if (one == null) {

                one = headB;

            } else {

                one = one.next;

            }

            if(two == null) {

                two = headA;

            } else {

                two = two.next;

            }

        }

        return one;

    }

}

解题思路:

两条链表同时遍历,A遍历完就接着遍历B,B遍历完就接着遍历A,由于最后遍历的次数是相同,如果遇到相同节点,就是相交的节点,如果没有相交,则最后都是null.

七、反转链表

1.反转全链表

/**

 * Definition for singly-linked list.

 * public class ListNode {

 *     int val;

 *     ListNode next;

 *     ListNode() {}

 *     ListNode(int val) { this.val = val; }

 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }

 * }

 */

class Solution {

    public ListNode reverseList(ListNode head) {

        if(head == null || head.next == null) {

            return head;

        }

        ListNode last = reverseList(head.next);

        head.next.next = head;

        head.next = null;

        return last;

    }

}

思路:

利用递归,后序遍历,将相邻的两个节点的指针给换位置即可。

2.反转前N个结点

Class Solusion {

ListNode rear = null;

Public ListNode reverseListN(ListNode head, int n) {

If (n == 1) {

rear = head.next;

}

ListNode last = reverseListN(head.next, n-1);

head.next.next = head;

head.next = rear;

}

return last;

}
  1. 反转区间结点的链表
/**

 * Definition for singly-linked list.

 * public class ListNode {

 *     int val;

 *     ListNode next;

 *     ListNode() {}

 *     ListNode(int val) { this.val = val; }

 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }

 * }

 */

class Solution {

    ListNode rear = null;

    public ListNode reverseBetween(ListNode head, int left, int right) {

        if (left == 1) {

            return reverseListN(head, right);

        }

        head.next = reverseBetween(head.next,left-1,right-1);

        return head;

    }

    ListNode reverseListN(ListNode head, int n) {

        if (n == 1) {

            rear = head.next;

            return head;

        }

        ListNode last = reverseListN(head.next, n-1);

        head.next.next = head;

        head.next = rear;

    return last;

    }

}

思路:

1.现将区间和链表同时移动,直到是从1开始反转,也就是只反转前几个节点就可以了

2.调用反转前N个结点的递归方法即可

  1. k个一组反转链表
    1. 思路:使用迭代性质,前序遍历
/**

 * Definition for singly-linked list.

 * public class ListNode {

 *     int val;

 *     ListNode next;

 *     ListNode() {}

 *     ListNode(int val) { this.val = val; }

 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }

 * }

 */

class Solution {

    public ListNode reverseKGroup(ListNode head, int k) {

        if(head == null) {

            return null;

        }

        ListNode a = head;

        ListNode b = head;

        for(int i = 0; i< k; i++) {

            if(b == null) {

                return head;

            }

            b = b.next;

        }

        ListNode temp = reverse(a,b);

        a.next = reverseKGroup(b,k);

        return temp;

    }

     ListNode reverse(ListNode a, ListNode b) {

        ListNode pre = null;

        ListNode cur = a;

        ListNode next = a;

        while(cur != b) {

            next =cur.next;

            cur.next = pre;

            pre  = cur;

            cur = next;

        }

        return pre;

    }

}
  1. 先反转head开头的第k个结点
  2. 接着反转第k+1个元素为head递归调用reverseKGroup函数
  3. 最后将反转的结果接上即可。

八、判断回文单链表;

方法1:将原链表反转成一条新链表保存起来,然后两条链表同时比较即可判断是否是回文链表

/**

 * Definition for singly-linked list.

 * public class ListNode {

 *     int val;

 *     ListNode next;

 *     ListNode() {}

 *     ListNode(int val) { this.val = val; }

 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }

 * }

 */

class Solution {

    ListNode newHead = new ListNode(-1);

    public boolean isPalindrome(ListNode head) {

        ListNode p2 = newHead;

        ListNode p3 = reverse(head);

        p2 = p2.next;

        while(p2 != null) {

            if(p2.val != p3.val) {

                return false;

            }

            p2 = p2.next;

            p3 = p3.next;

        }

        return true;

    }

    ListNode reverse(ListNode head) {

        newHead.next = new ListNode(head.val);

        newHead = newHead.next;

        if (head == null || head.next == null) {

            return head;

        }

        ListNode last = reverse(head.next);

        head.next.next = head;

        head.next = null;

        return last;

    }

}

方法2:使用二叉树的后序遍历

/**

 * Definition for singly-linked list.

 * public class ListNode {

 *     int val;

 *     ListNode next;

 *     ListNode() {}

 *     ListNode(int val) { this.val = val; }

 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }

 * }

 */

class Solution {

    ListNode left = null;

    boolean flag = true;

    public boolean isPalindrome(ListNode head) {

        left = head;

        df(head);

        return flag;

    }

    void df(ListNode right) {

        if(right == null) {

            return;

        }

        df(right.next);

        if(left.val != right.val) {

            flag = false;

        }

        left = left.next;

    }

}

方法3:先找到中点,取中点前面部分保存,然后翻转后面部分,保存,最后两部分进行比较即可(利用类似二分法的方式)

九、使用快慢指针-删除链表中重复元素

/**

 * Definition for singly-linked list.

 * public class ListNode {

 *     int val;

 *     ListNode next;

 *     ListNode() {}

 *     ListNode(int val) { this.val = val; }

 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }

 * }

 */

class Solution {

    public ListNode deleteDuplicates(ListNode head) {

        if(head == null) {

            return head;

        }

        ListNode show = head;

        ListNode fast = head.next;

        while(fast != null) {

            if(show.val == fast.val) {

                fast = fast.next;

                continue;

            }

            show.next = fast;

            fast = fast.next;

            show = show.next;

        }

        show.next = null;

        return head;

    }

}

思路:

1.使用快慢双指针

2.慢指针与快指针相比较,快指针在前面探路,如果快慢指针的值不相等,则将慢指针的位置值替换成快指针的,然后双方继续前进一步

3.最后将慢指针的next置为null并返回头链表

真的神了~无意中发现1500道的2021LeetCode算法刷题pdf笔记 昨晚逛GitHub,无意中看到一位大佬的算法刷题笔记,感觉发现了宝藏!有些小伙伴可能已经发现了,但咱这里还是忍不住安利一波,怕有些小伙伴没有看到。 关于算法刷题的困惑和疑问也经常听朋友们提及。这份笔记里面共包含作者刷力扣算法题后整理的上千道题,每道题均附有详细题解过程。有了这个笔记的总结,对校招和社招的算法刷题帮助之大不言而喻,果断收藏安利。 累计1500+道...拿来即刷!word很大,你忍一下,我就不一一截图了,诸君自行下载哈。 可以看到,每道题的原题,题目大意,解题思路,以及代码实现都非常 阅读详情

相关推荐

2021.5.21开始的兔系刷题之路 根据LeetCode分类进行逐个击破 培养出自己的套路~

从前辈们的学习经验中获得建议 并开始一点点地实践 争取一天可以刷一道题 慢慢地把这些专题都刷过来!

一碗菜粥的博客 2566

leecode-试水

1.两数之和 描述:给定一个整数数组nums和一个目标值target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。 暴力循环 没啥好说的,最容易想到的逻辑,时间复杂度O(n2) 双指针 排序后,利用双指针向中间逼近,知道找到目标值,时间复杂度O(nlogn) class Solution { public: vector<int> two...

40KO的博客 440

分享刷LeetCode算法题pdf笔记,看完你就是面试官

废话不多说,直接上算法刷题笔记 百度网盘地址链接:https://pan.baidu.com/s/1Z0j_F4KSJE8q9j5Rs8p6Lg 提取码:you1 关于算法刷题的困惑和疑问也经常听朋友们提及。这份笔记里面共包含作者刷LeetCode算法题后整理的数百道题,每道题均附有详细题解过程。很多人表示刷数据结构和算法题效率不高,甚是痛苦。有了这个笔记的总结,对校招和社招的算法刷题帮助之大不言而喻,果断推荐给大家。 第二章算法专题 Array Backtracking Bina...

1730

数据结构(2)线性表

二.算法相关基本概念 1.算法:对问题的解决步骤。 2.五大特性:有穷性,确定性,可行性,输入,输出。 3.算法模式:采用自然语言或者计算机语言给出算法的指令序列。 4.算法设计目标:正确性,可用性,可读性,健壮性,高效和低储存量。 5.时间复杂度:以基本操作重复执行的次数作为时间度量。 常见时间复杂度有O(1)<=O()<=O(n)<=O(n)<=O(n2) 6.空间复杂度:算法运算过程占用的存储空间。 ...

weixin_44113772的博客 306

【回眸】牛客网刷刷刷(四)软件工程(续)&ZooKeeper&字符串&链表(专题)

本篇博客为笔者刷客观笔试题时做的一些记录以供以后复习时翻阅,如果能够帮到您是最大的荣幸!如果能给笔者一个三连将感激不尽!

啤酒鸭的物联网开发记录博客 538

麒麟V10 SP3国产化环境部署MySQL 8.0全流程实战

本文详细介绍了在国产化操作系统麒麟V10 SP3上部署MySQL 8.0的全流程实战指南。从环境准备、冲突排查到安装包处理、服务配置与安全加固,提供了详细的命令和技巧,帮助用户顺利完成MySQL 8.0的部署与优化,适用于国产化环境下的数据库应用。

weixin_29231027的博客 266

算法题回顾:双指针链表系列集锦

如下示意图,首次相遇,slow走了k步, fast走了2k步,环的长度是k, 假设相遇节点离环的起点距离是n, 则从头节点到slow位置是k, 从头节点到环起点begin是k-n。判断环的起点:只需要在fast和slow相遇时候,将slow节点重新指向头节点,然后slow和fast指针开始同步前进,当再次相遇时候,即为环的起始节点。基本版本:遍历两遍链表,第一遍 知道链表的长度n,第二遍,倒数第k个节点,就是正数第n-k+1个节点,输出第n-k+1个节点。给一个链表数组,每个链表都是升序排列。

Briwisdom的博客 1060

为什么你的Nginx配置SM2国密SSL证书失败?这些坑我都帮你踩过了

本文针对Nginx配置SM2国密SSL证书的常见失败原因,提供了详细的排查与解决方案。核心在于使用支持国密算法的Nginx版本(如集成Tongsuo库),正确处理从阿里云等平台获取的证书格式,并正确配置ssl_ciphers等关键参数。文章还解释了浏览器兼容性差异及双证书部署等进阶场景,帮助运维和开发人员高效完成国密合规改造。

weixin_29228203的博客 385

【数据结构】——链表面试题详解

链表面试习题详解

weixin_62678196的博客 595

AD20.多对多工程中将某个原理图导入PCB工程

AD20将多个原理图中的一个或多个导入到PCB文件中

鬼爷杂货铺 1万+

在Cursor中集成Ollama与Qwen2.5‑Coder:零成本本地AI开发环境搭建

本文详细介绍了如何零成本搭建本地AI开发环境,通过将Cursor IDE与本地运行的Ollama及Qwen2.5-Coder模型集成,实现数据不出本地的智能编程辅助。教程涵盖Ollama安装、模型拉取、ngrok内网穿透配置及Cursor设置等核心步骤,并提供了实战测试与常见问题排错指南,为注重隐私与成本的开发者提供安全高效的解决方案。

weixin_29296241的博客 1071

代码随想录算法训练营(60天刷题笔记)

则每次循环都要保证得到的区间是左闭右开的。左开右闭或者左闭右闭同理。

ShangHe000的博客 799

BrepNet实战:5分钟搞定三维CAD模型的加工特征识别(附Python代码)

本文详细介绍了BrepNet在三维CAD模型加工特征识别中的实战应用,通过Python代码演示了从环境搭建到模型训练的全流程。BrepNet基于边界表示(BRep)的深度学习框架,能够高效识别加工特征,显著提升工业设计和智能制造领域的效率。文章还提供了性能优化和部署建议,帮助开发者快速实现AI驱动的几何特征识别。

weixin_29044713的博客 507

LeetCode刷题笔记【0】:系列简介(持续更新系列Link)

决定从今天起分享自己的LeetCode刷题笔记,会有相关知识的回顾、题目简介、做题思路、代码。后续在这里更新本系列的Link。

Eibosinu的博客 313

QCC304x系列开发教程(实战篇)之5.2 QCC3040之提示音

earbud_init.c中,初始化table中UiPrompts_Init /*! \brief Table of initialisation functions */ static const init_table_entry_t appInitTable[] = { ......... {UiPrompts_Init, 0, NULL}, ......... } ui_prompts.c中是提示音音处理的主要逻辑和配置源文件 函数static void uiPro...

心跳包的博客 2392

【Python】-- 趣味代码 - 发牌游戏

Python -- 趣味代码 - 发牌游戏

银尘博客 351

leetcode刷题方法&路径

一开始刷题的时候不能够随便找个题就来做,应该一段时间专门突击某个专题,如“链表”、“二叉树”等。在刷题的过程中应该自己首先想一想,不要一没有思路就去网上找(这样刷题没有效果),自己思考半天试了一试还是做不出来就去百度。做过的题应该做笔记,反复看就跟高中做题一样,有错题本,反复看才有效果。

weixin_44163570的博客 1056

《YOLOv8:从入门到实战》专栏介绍 & 专栏目录

本专栏涵盖了丰富的YOLOv8算法从入门到实战系列教程,专为学习YOLOv8的同学而设计,堪称全网最详细的教程!🌈🌈🌈

小哥谈 6488

LeetCode算法训练营 - 从新手到高手的实战进阶指南

本文提供了一份系统的LeetCode算法训练进阶指南,旨在帮助开发者从新手成长为高手。指南详细规划了三个阶段:从构建数据结构与基础算法思维,到学习树、图、动态规划等经典组合技,最终攻坚高级数据结构与系统设计思维。核心在于通过系统性训练和刻意练习,将解题能力内化为编程直觉,高效备战技术面试与提升工程问题解决能力。

rgv234567的博客 471

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

算法题到底该怎么刷?高效刷题方法

算法题到底该怎么刷?高效刷题方法

weixin_41171614的博客 4101

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

刷完 900 多道算法题的首次总结:LeetCode 应该怎么刷?

LeetCode 算法题应该怎么刷?算法题学习路线?怎么组队刷题?有没有算法刷题群? 你是怎么入门 LeetCode 的?刷完 1000 道算法题是什么体验?大家都是怎么刷题的? 新手小白开始刷算法题应该怎么刷,注意什么?刷 LeetCode 总是觉得太难怎么办? 刷算法题有没有书籍推荐?该按照什么顺序刷算法题?LeetCode 怎么看别人的题解?有哪些好的算法题博主推荐?

负雪明烛 13万+

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

刷完 300 道 LeetCode 题后,我膨胀到要飘起来了!纯正 Java 版

优快云 的小伙伴们,大家好,我是爱学习爱分享的沉默王二。 迫不及待的小伙伴可以直接拖到文末,拉取离线版的下载地址,无套路无解压密码,我整理了将近一周的时间。 不经意间,在 GitHub 上发现了一个 1G 棒的 LeetCode 刷题笔记,重点来了,是纯正的 Java 版。我见过很多牛逼的刷题笔记,有 Go 版的,有 C++ 版的,唯独没有 Java 版的,所以这次,我感觉找到了宝藏! 其实私下里很多小伙伴问我有没有 Java 版的,一开始我觉得刷题嘛,用啥语言刷题根本不重要,重要的是解题的思路。但看到这

沉默王二 3万+

LeetCode Java面试刷题笔记汇总

LeetCode Java刷题笔记汇总,按照类型刷题效率更高。

终生学习践行者 2948

[C++]Leetcode超高效刷题顺序及题目详解笔记(持续更新中)

一.引言 博主最近在LeetCode上用C++练习。一路走来踩过一些坑,做了一些总结和笔记,分享给需要的人。 LeetCode网址:https://leetcode.com/ LeetCode中文版:https://leetcode-cn.com/ 二.刷题指南 LeetCode 是一个非常棒的平台,收集了许多公司的面试题目。相对其他平台而言,有着下面的几个优点: 题目全部来自业内大公司的真实面试不用处理输入输出 精力全放在解决具体问题上题目有丰富的讨论 可以参考别人的思路精确了解自己代码在所有提交代码中

cpb____的博客 2万+

高频知识总结 | 算法题如何刷?我的高效刷题方法

下面把我平时针对每道题的题号收集、博客资料收集的文档都分享给大家。注意!这个题号并不是说就要全部都刷,因为时间来不及,一定把我上面提到的高频题按分类给刷明白了,如果有余力再把剩下的给刷了!所有回溯递归都是一样的套路,明确递归的对象,对一个节点进行考虑,正如二叉树一样,回溯其就是 N叉树 + 剪枝明确递归的对象,要对哪个节点进行递归(二叉树)?还是对一张表的一个格子进行递归(岛屿问题)?还是要对一个状态进行递归(全排列树状图画出来)?

C++,Java,Python,C#编程选手,偶尔刷刷leetcode 2783

链表之快慢指针刷题笔记:回文链表,链表最大孪生和

ps:笔记和代码按本人理解整理,重思路

学习记录 1013
上一篇: 设计模式之代理模式(golang)
下一篇: 对软件重构的认识与重构原则
huahua.Dr
博客等级 码龄8年 87粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值