- 博客(32)
- 收藏
- 关注
原创 移动零
题目描述:给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。示例:输入: [0,1,0,3,12]输出: [1,3,12,0,0]解题思路:使用双指针,快指针(right)指向第一个不为0的位置,慢指针(left)指向第一个0 ,然后对两个位置的元素进行交换。如果遇到0,则只有快指针移动,慢指针原地不动,这样就使快指针指向了第一个不为0的位置时慢指针指向第一个0.class Solution { public void moveZeroes(
2021-10-16 12:27:41
198
原创 环形链表
题目描述:给定一个链表,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。如果链表中存在环,则返回 true 。 否则,返回 false 。进阶:你能用 O(1)(即,常量)内存解决此问题吗?示例:输入:head = [3,2,0,-4]
2021-09-25 16:22:52
157
原创 验证回文串
题目描述:给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。说明:本题中,我们将空字符串定义为有效的回文串。示例:输入: “A man, a plan, a canal: Panama”输出: true解释:“amanaplanacanalpanama” 是回文串输入: “race a car”输出: false解释:“raceacar” 不是回文串解题思路:方法一:验证回文串,可以将该字符串反转然后与原串进行对比,如果两个串相等,那么可以说明这个字符串
2021-09-23 22:37:36
132
原创 实现strStr()
题目描述:实现 strStr() 函数。给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回 -1 。说明:当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与 C 语言的 strstr() 以及 Java 的 indexOf() 定义相符。示例:输入:haystack = “h
2021-09-22 19:17:54
87
原创 移除元素
题目描述:给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。示例:输入:nums = [3,2,2,3], val = 3输出:2, nums = [2,2]解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长
2021-09-19 20:42:50
74
原创 删除有序数组中的重复项
题目描述:给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。说明:为什么返回数值是整数,但输出的答案是数组呢?请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。你可以想象内部操作如下:// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝int len = removeDuplicat
2021-09-19 20:01:59
94
原创 BiNode
题目描述:二叉树数据结构TreeNode可用来表示单向链表(其中left置空,right为下一个链表节点)。实现一个方法,把二叉搜索树转换为单向链表,要求依然符合二叉搜索树的性质,转换操作应是原址的,也就是在原始的二叉搜索树上直接修改。返回转换后的单向链表的头节点。示例:输入: [4,2,5,1,3,null,6,0]输出: [0,null,1,null,2,null,3,null,4,null,5,null,6]解题思路:首先题目要求就是将二叉排序树转换成一个单向链表,但是这个链表的节点还是
2021-09-09 20:00:48
127
原创 合并两个排序的链表
题目描述:输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。示例:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4解题思路:方法一:创建新的链表struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2){ if(l1 == NULL || l2 == NULL) { ret
2021-09-08 20:16:05
77
原创 删除链表中的节点(只给出待删除节点) C语言
题目描述:请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点。传入函数的唯一参数为 要被删除的节点 。注意:在只给出待删除节点的情况下删除该结点。void deleteNode(struct ListNode* node) { node->val = node->next->val; node->next = node->next->next;}...
2021-09-06 20:43:07
114
原创 回文链表 C语言
题目描述:给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。示例:输入:head = [1,2,2,1]输出:true输入:head = [1,2]输出:false解题思路:将后半部分的链表反转然后和前半部分的链表进行比较,判断是否是回文链表。对链表分割时先找到中间节点,使用快慢指针的方法。slow先指向head,fast指向head->next ,slow一次走一步,fast一次走两步。如果链表是奇数个节点
2021-09-05 20:29:38
579
原创 移除链表元素 C语言
题目描述:给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。示例:输入:head = [1,2,6,3,4,5,6], val = 6输出:[1,2,3,4,5]输入:head = [], val = 1输出:[]输入:head = [7,7,7,7], val = 7输出:[]解题思路:使用新的头节点,让指针p先指向新的头节点,然后遍历链表,依次检查p->next->val,如果
2021-09-05 18:54:45
583
原创 相交链表
题目描述:给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。题目数据 保证 整个链式结构中不存在环。注意,函数返回结果后,链表必须 保持其原始结构 。解题思路:方法一:哈希表遍历第一个链表,将节点存放到哈希表中,然后遍历第二个链表,并判断该链表中的节点是否在哈希表中,如果不在,就继续遍历;如果在哈希表中,就返回该结点。如果第二个表中所有的节点都不在哈希表中就返回NULLpublic class Soluti
2021-09-05 12:07:10
89
原创 对链表进行插入排序 C语言
新建一个新的头结点,然后依次将原链表的结点按顺序插入到新的表中。p表示原链表中待插入的结点。q表示新链表中待插入位置的前驱节点。temp保留p的后继结点信息。struct ListNode* insertionSortList(struct ListNode* head){ if(head == NULL || head->next == NULL) return head; struct ListNode newHead; //新建头结点
2021-08-30 22:59:52
413
原创 重排链表 C语言
题目描述:给定一个单链表 L 的头节点 head ,单链表 L 表示为:L0 → L1 → … → Ln-1 → Ln请将其重新排列后变为:L0 → Ln → L1 → Ln-1 → L2 → Ln-2 → …不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。示例:输入: head = [1,2,3,4]输出: [1,4,2,3]输入: head = [1,2,3,4,5]输出: [1,5,2,4,3]解题思路:寻找中间结点 + 链表逆转 + 合并链表1.找到链表的中
2021-08-30 10:58:23
1311
原创 二叉树展开为链表 C语言
题目描述:给你二叉树的根结点 root ,请你将它展开为一个单链表:展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。展开后的单链表应该与二叉树 先序遍历 顺序相同。示例:输入:root = [1,2,5,3,4,null,6]输出:[1,null,2,null,3,null,4,null,5,null,6]输入:root = []输出:[]输入:root = [0]输出:[0]解题思路:struct T
2021-08-29 10:20:51
260
原创 有序链表转换成二叉搜索树 C语言
题目描述:给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。解题思路:对于高度平衡二叉树对每个结点都要满足左右子树的高度差绝对值不超过1。我们可以将链表的中间结点作为根节点建立二叉树,左侧和右侧的结点分别作为左孩子和右孩子,然后递归建立整个二叉树。这样建成的二叉树对于每一个结点,其左右子树的高度差绝对值不超过1。使用快慢指针寻找链表的中间结点快指针fast 和 慢指针slow先
2021-08-28 20:59:05
309
原创 反转链表 Ⅱ C语言
题目描述:给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。示例:输入:head = [1,2,3,4,5], left = 2, right = 4输出:[1,4,3,2,5]输入:head = [5], left = 1, right = 1输出:[5]解题思路:反转链表的一部分,首先需要找到这部分结点,保留左侧结点的前驱节点和右侧结点的后继结点。
2021-08-28 13:57:41
249
原创 分隔链表 c语言
题目描述:给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。你应当 保留 两个分区中每个节点的初始相对位置。示例:输入:head = [1,4,3,2,5,2], x = 3输出:[1,2,2,4,3,5]输入:head = [2,1], x = 2输出:[1,2]解题思路:设置两个头结点,small连接比x小的结点,big连接大于等于x的结点。遍历链表,将较小的结点连接在small后面,较大的结点连接
2021-08-28 10:54:13
147
原创 删除链表重复元素 C语言
题目描述:存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除所有重复的元素,使每个元素 只出现一次 。返回同样按升序排列的结果链表。示例:输入:head = [1,1,2]输出:[1,2]输入:head = [1,1,2,3,3]输出:[1,2,3]解题思路:先判断链表是否为空。让指针p指向表头,判断p->next->val是否和p->val 相等,相等就修改p->next,不相等就让指针p后移。struct ListNode* delete
2021-08-28 10:13:03
1128
1
原创 删除排序链表中的重复元素 II C语言
题目描述:存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字。返回同样按升序排列的结果链表。示例:输入:head = [1,2,3,3,4,4,5]输出:[1,2,5]输入:head = [1,1,1,2,3]输出:[2,3]解题思路:由于需要把重复的元素都删除,需要使用两个指针先确定重复元素的区间,另外一个指针来重新连接链表。pre用来重新连接链表,left确定左端点,right确定右端点。循环
2021-08-27 22:14:44
485
原创 旋转链表 C语言
题目描述:给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。示例:输入:head = [1,2,3,4,5], k = 2输出:[4,5,1,2,3]输入:head = [0,1,2], k = 4输出:[2,0,1]解题思路:先将链表首尾相连,形成环,然后找到新的头尾结点即可。struct ListNode* rotateRight(struct ListNode* head, int k){ if(head == NULL || head->
2021-08-27 16:48:43
313
原创 两两交换链表中的结点 C语言
题目描述:给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。示例:输入:head = [1,2,3,4]输出:[2,1,4,3]输入:head = []输出:[]输入:head = [1]输出:[1]方法一:迭代法struct ListNode* swapPairs(struct ListNode* head){ struct ListNode *newHead = malloc(sizeof(struct
2021-08-27 10:54:08
2078
原创 Leetcode 合并两个有序链表 C语言
题目描述:将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例:输入:l1 = [1,2,4], l2 = [1,3,4]输出:[1,1,2,3,4,4]输入:l1 = [], l2 = []输出:[]输入:l1 = [], l2 = [0]输出:[0]方法一: 迭代法struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2){ //如果有空链
2021-08-26 21:00:34
163
原创 删除链表的倒数第n个结点 C语言
题目描述:给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。进阶:你能尝试使用一趟扫描实现吗?示例:输入:head = [1,2,3,4,5], n = 2输出:[1,2,3,5]输入:head = [1], n = 1输出:[]题解:使用快慢指针方法,当快指针走到链表尾的时候,慢指针刚好走到待删除结点的前驱节点,然后令left->next = left->next->next;如果链表只有一个结点的时候,使用快慢指针不方便操作,所以考虑加一个新
2021-08-26 19:11:39
676
1
原创 两数相加 C语言
题目描述:给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。示例:输入:l1 = [2,4,3], l2 = [5,6,4]输出:[7,0,8]解释:342主要是要判断每个节点的值应该是多少,考虑是否需要进1等问题。struct ListNode* addTwoNumbers(struct ListNode* l
2021-08-26 14:18:13
240
原创 C语言 278.第一个错误版本
题目描述:假设你有 n 个版本 [1, 2, …, n],你想找出导致之后所有版本出错的第一个错误的版本。该题可以采用暴力法求解,循环遍历数组找到第一个错误的版本。但是需要减少调用bool isBadVersion(version) 接口的次数,所以采用二分查找。如上图所示,第一个错误版本就是我们查找的目标,他的前一个版本是正确版本,这是对目标的判断条件。初始化两个指针left和right,分别指向0和n-1中点采用 mid = left+((right-left)>>1); 的方
2021-08-25 09:30:23
179
原创 704 二分查找 C语言
二分查找需要用到双指针。初始化左指针left=0,右指针right=numsSize-1;下面是需要注意到的几点:1.循环的条件:在while循环中条件可以是left<right,也可以是left<=right如果是left<right,当left == right 的时候会退出循环,这是需要在循环外进行判断。如果是left<=right,当left == right 的时候会进行最后一次循环,需要在循环体里进行判断。2.mid的取法。取中点时通常会使用mid = (
2021-08-24 18:49:56
278
1
原创 LeetCode 136只出现一次的数字 C语言
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。看到题目后第一反应是利用哈希表存储每个数字和该数字出现的次数。通过遍历数组得到每个数字出现的次数,并更新哈希表,最后遍历哈希表就可以得到只出现一次的数字。但是题目有要求:达到线性时间复杂度和常数空间复杂度。为了达到这一要求需要使用位运算。对于该题可以使用异或运算。异或运算有如下三个性质:1.任何数和 0做异或运算,结果仍然是原来的数9^0=9示例9 10010 0000结果9
2021-08-23 09:09:20
181
原创 前n个数字二进制中1的个数
题目:给定一个非负整数 n ,请计算 0 到 n 之间的每个数字的二进制表示中 1 的个数,并输出一个数组。首先需要知道怎么判断一个数字二进制中1的个数.利用性质n&(n-1)可以将n的最低位的1置0经过多少次该运算可以把n置0,就表示n中有多少个1 int numberOfOne(int n)//寻找每个数的二进制表示中1的个数 { int ans=0; while(n) { n&=(n-1); //利用性质n&(n-1)
2021-08-22 21:27:20
237
原创 LeetCode LCP07.传递信息
LCP.07传递信息可以利用有向图的深度优先搜索遍历解题。void dfs(int n, int** relation, int relationSize, int k,int *ans,int people)//people表示传递给了第几个人{ if(k==0) //递归终止的条件 如果信息传递给了最后一个人,方案数+1 { if(people == n-1) (*ans)++; return; } for(i
2021-08-22 21:15:23
138
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人