![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
力扣LeetCode
锤子哥学编程
学习
展开
-
【力扣LeetCode】复制带随机指针的链表
题目:题目分析:解决这个问题的思路如下:1、先复制原来链表的每个节点,新节点连接起来;2、算原链表中每个节点cur的random跟cur的相对距离,再去复制新链表到当前节点相对距离的节点,赋值给random,找每个节点的random时间复杂度是O(N),那么有N节点,整体的复杂度是O(N^2)。这个算法的效率是比较低的,因此要对其做些优化:1、在原链表的每个结点的后面,链接插入一个拷贝节点;2、置random;3、把拷贝节点解下来,链接到一起,同时恢复原链表。代码实现:/** *原创 2021-09-14 18:23:54 · 158 阅读 · 1 评论 -
【力扣LeetCode】环形链表Ⅱ
题目:给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意,pos 仅仅是用于标识环的情况,并不会作为参数传递到函数中。题目分析:方法:1、首先使用快慢指针的方法找到相遇点;2、接着使两个指针分别从head头节点的位置和meet相遇节点的位置同时走;3、当这两个节点相等的时候,所在的位置,即为所求的入环节点。代码实现原创 2021-09-14 16:25:50 · 139 阅读 · 0 评论 -
【力扣LeetCode】环形链表
题目:给定一个链表,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。如果链表中存在环,则返回 true 。 否则,返回 false 。题目分析:解决这个问题可以采用快慢指针的方法,快指针走两步,慢指针走一步,如果后期两个指针相遇的话,说明原创 2021-09-14 15:58:45 · 127 阅读 · 5 评论 -
【力扣LeetCode】相交链表
题目:给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。题目分析:解决这道题,我们的常规思路就是暴力求解,A链表每个节点依次去跟B链表的所有节点比较,如果有相同就是交点,如果没有就是不相交。但是其实在此基础上还是有优化思路的:可以分别求出A和B的长度,lenA和lenB,让长的链表先走|lenA-lenB|,再同时走找交点。代码实现:/** * Definition for singly-linked lis原创 2021-09-14 15:06:09 · 160 阅读 · 0 评论 -
【力扣LeetCode】合并两个有序链表
题目:将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。题目分析:解决这个问题的方法是,可以将两个链表中的数据依次比较,然后我们可以将较小的取下来尾插,就这样依次进行,直到其中一个走到空,就可以结束了。代码实现:/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */s原创 2021-09-13 13:15:16 · 350 阅读 · 4 评论 -
【力扣LeetCode】链表的中间节点
题目:给定一个头结点为 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。题目分析:解决这个问题可以使用快慢指针的方法来解决:快慢指针,slow一次走一步,fast一次走两步,fast走到结尾的位置或走到空的时候,slow就走到了中间节点的位置。代码实现:/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode原创 2021-09-13 11:39:03 · 132 阅读 · 0 评论 -
【力扣LeetCode】反转一个链表
题目:给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。示例1:示例2:题目分析:思路一:调节结点指针方向。解题步骤:在这里,可以使用创建3个指针的方法,创建3个指针n1、n2、n3,将n1置成空指针,将n2看作head头指针,将n3看作head->next,这样从前往后依次迭代,当n2等于空的时候停止。注意:n1和n2倒放向,n3进行迭代。思路二:头插法(原链表的一些节点拿下来头插)。解题步骤:创建一个newhead指针置成空,然后将原链表的head原创 2021-09-13 11:14:15 · 251 阅读 · 6 评论 -
【力扣LeetCode】移除链表元素
题目:给你一个链表的头节点head和一个整数val ,请你删除链表中所有满足 Node.val == val 的节点,并返回新的头节点 。题目分析:思路1:cur找到val值所在的节点,prev记录前一个位置,依次删除。思路2:创建一个新链表,把链表中所有不是val的值尾插到新链表,删除等于val的节点。在这里,对思路2进行代码实现:/** * Definition for singly-linked list. * struct ListNode { * int val;原创 2021-09-11 17:31:01 · 76 阅读 · 4 评论 -
【力扣LeetCode】合并两个有序数组
题目:给你两个按非递减顺序排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。请你合并nums2 到 nums1 中,使合并后的数组同样按非递减顺序排列。注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后n个元素为0 ,应忽略。nums2 的长度为n 。示例1:输入:nums1 = [1,2,3,0,0,0],原创 2021-09-11 11:54:43 · 1903 阅读 · 0 评论 -
【力扣LeetCode】删除有序数组中的重复项
题目:给你一个有序数组 nums ,请你原地删除重复出现的元素,使每个元素只出现一次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。示例:输入:nums = [1,1,2]输出:2, nums = [1,2]解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。题目分析:当面对这个题的时候,我们应该怎样去处理呢?接下来告诉大家一个方法:我们原创 2021-09-11 10:48:06 · 479 阅读 · 5 评论