- 博客(17)
- 收藏
- 关注
原创 Leetcode:分隔链表(java)
解体思路:创造两个链表cur1和cur2,遍历(while(head!= null))目标链表,当head指针所指的值小于目标值时,cur1.next指向它,反之cur2.next指向它。而后head = head.next进行下一次循环遍历。输入:head = [1,4,3,2,5,2], x = 3。你应当 保留 两个分区中每个节点的初始相对位置。输入:head = [2,1], x = 2。,请你对链表进行分隔,使得所有 小于。输出:[1,2,2,4,3,5]给你一个链表的头节点。
2023-09-04 16:50:42
214
1
原创 Leetcode:删除链表的倒数第n个节点(java)
但是这种解法有点野路子的感觉,所以这里还有一种解法用快慢指针,快慢指针开头都指向虚拟节点,快指针先遍历n次节点而后两个指针一起进行遍历,到最后快针与慢针的距离就是n,那么慢针下一个就是要删除的节点。解题思路1:倒数n个节点如果把链表反转就是正数的第n个节点,那么只要反转链表然后遍历到n-1删除节点再反转链表就行。输入:head = [1,2,3,4,5], n = 2。输入:head = [1,2], n = 1。输入:head = [1], n = 1。输出:[1,2,3,5]
2023-09-01 10:44:30
247
1
原创 Leetcode:两两交换链表中的节点
这时候就该思考循环条件了,由于我们不知到链表的长度,但我们知道链表的尾节点指向null,所以这时候不能用for而应该用while循环,且循环条件应该为指针不为空。需要进行的操作为,指针1指向整体(即指向头节点),指针2和3找到了第一和第二节点,而后指针三指向指针二,指针二指向下一个整体的第一个节点,指针一指向下一个整体的前置节点;通过观察示例1、2、3可以发现实际返回的都是整个链表,那么我们可以假设最后return的是同一个链表我们在return之前进行if过滤。输入:head = [1,2,3,4]
2023-08-31 14:43:53
126
原创 Leetcode:反转链表(Java)
解题思路:用双指针加一个临时指针进行反转,创造两个指针分别指向头和尾,临时指针指向头指针指向的位置,然后让头指针指向尾指针所在的位置,尾指针换到头指针所在的位置(不是指向),最后头指针换到临时指针所在的位置。这算是完成一次循环,当头遍历到尾时就完成了链表的反转。输入:head = [1,2,3,4,5],请你反转链表,并返回反转后的链表。输入:head = [1,2]输出:[5,4,3,2,1]输入:head = []
2023-08-30 14:29:22
246
1
原创 Leetcode:合并两个有序列表(java)
/因为list3是不断在更新最后list3.next指向null的,而初始位置是虚拟节点无意义所以用dummy.next。= null){//只有当表1或表2有一者为空时跳出循环。//将dummy赋值给list3,list3初始位置适中为dummy。新链表是通过拼接给定的两个链表的所有节点组成的。输入:l1 = [1,2,4], l2 = [1,3,4]输入:l1 = [], l2 = [0]输入:l1 = [], l2 = []输出:[1,1,2,3,4,4]
2023-08-30 14:15:45
290
1
原创 Leetcode:设计链表(单链表)
思路是先创造一个新的头节点其中值为val,而后让其指向head,而后head指向新的头节点,同时要注意插入了之后我们的链表长度变长了要size++那么排除了下标无效的情况后就需要找到下标为index的值,我的想法是设定一个当前节点进行循环直到i = index输出index的值即可。正常情况下删除则令要删除的前一个指针指向要删除的后一个指针,又由于创建的是单向链表所以无法向前指所以i的循环条件为i < index-1。if(index > =size || index < 0){//索引不在范围内。
2023-08-29 15:11:29
69
2
原创 Leetcode:移除链表元素(Java)
解题思路:因为删除链表中所有满足Node.Val == val的节点,所以我只要让原本指向这个节点的指针指向后一个节点就行即 temp.next = temp.next.next,但是我自己是没做出来的,我没有明白为什么要再设置一个链表希望有懂哥教教我。输入:head = [1,2,6,3,4,5,6], val = 6。输入:head = [7,7,7,7], val = 7。输入:head = [], val = 1。的节点,并返回 新的头节点。输出:[1,2,3,4,5]给你一个链表的头节点。
2023-08-28 17:38:51
76
1
原创 Leetcode:第一个错误的版本(Java)
因为我们搜寻的是第一个错误版本,而start不加1指到的是正确版本,会平白增加我们的搜索范围,同时这还和我们设置的循环条件有关系。解题思路:采取二分查找的思想,设start = 1和end = n两个指针,那么end-start就是要寻找的范围,因为在第一个错误版本后序都是错误的,所以当指到错误版本时那么后边的就可以全排除,当指到正确的时前边的就可以全排除。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。是否在单元测试中出错。
2023-08-25 12:05:20
57
1
原创 Leetcode:长度最小的子数组(Java)
解题思路2(滑动窗口):设定两个指针(start,end)同时指向数组头,循环开始(条件为当end<nums.length条件为真时持续循环)sum += nums[end],嵌套循环(条件sum>=target为真时持续循环)count与子数组长度(end-start+1)做比较,若是count较小则count=子数组长度,sum减去start这一轮指向指针的元素(sum -= nums[i]) ,而后start指针向右移动一格。输入:target = 7, nums = [2,3,1,2,4,3]
2023-08-24 12:11:16
173
1
原创 Leetcode:移除元素(Java)
解题思路:我想的是采用双指针的方法,左指针指向数组头,右指针指向数组尾,while循环条件为left<right,如果Val == nums[left],则nums[left] = nums[right]并且right--,else则left++。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。不要使用额外的数组空间,你必须仅使用。的元素,并返回移除后数组的新长度。
2023-08-23 18:01:19
42
原创 Leetcode:二分查找(java)
解题思路:设左边为0,右边为数组长度-1(因为数组从0开始),而后设定mid始终指向数组索引的中间值,通过while循环在数组里寻找与target值相等的元素,返回元素索引,若值小于mid指向的元素那么下一轮则排除右边一半数组(right = mid - 1),反之亦然(left = mid + 1)。,如果目标值存在返回下标,否则返回。个元素有序的(升序)整型数组。
2023-08-23 11:23:58
127
原创 Leetcode:寻找两个正序数组的中位数(java)
2. 数组索引越界问题:在循环中使用 `nums[m+1]` 和 `nums[length/2+1]` 来访问数组元素。在索引 `m` 达到 `length-1` 时,`nums[m+1]` 将超出数组范围。在索引 `length/2` 达到 `length-1` 时,`nums[length/2+1]` 也将超出数组范围。5. 性能问题:在代码的第8行和第12行,使用两个循环来将 `nums1` 和 `nums2` 的元素复制到 `nums` 数组中,这样可能会带来额外的性能开销。
2023-08-22 11:22:57
241
1
原创 Leetcode:搜索插入位置(java)
解题思路1:一开始我想的是用指针从头遍历到尾,若是相等则输出指针位置,若是target<nums[i]则输出i-1,若是target>nums[i]&& i == nums.length-1则输出i+1但是这种方法是错的,因为相等和小于的插入实际上是一个意思所以应该改为target<=nums[i]输出i,而当遍历完后仍然没有满足这两个条件,那么视为target大于数组里的所有数,所以输出nums.length即可。输入: nums = [1,3,5,6], target = 2。请必须使用时间复杂度为。
2023-08-21 18:56:53
81
1
原创 Leetcode:罗马数字转整数(java)
今天做了罗马数字转整数这道题,一开始没有发现题目里讲前一位数字比后一位小要进行减法一直报错。发现了之后想用三元运算符做条件判断,但是leetcode好像不支持,最后还是用了if和else。
2023-08-18 11:41:57
55
1
原创 leetcode:验证回文串(java)
今天做了验证回文串,一开始想的是用两个for循环做,后来优化成了用一个while做,以下是代码(优化空间还是很大的)
2023-08-17 11:54:24
61
1
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人