|
- 作者:烧洋芋的土豆
- 内容:使用Java语言刷Leetcode算法题
- 技术交流:分享日常学习知识,平常遇到的问题,一些学习资料,一起学习,一起进步。
<hr/>
2. 合并两个有序链表
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 1:

输入:输入:l1 = [1,2,4], l2 = [1,3,4] 输出:[1,1,2,3,4,4] 示例 2:
输入:l1 = [], l2 = [] 输出:[] 示例 3:
输入:l1 = [], l2 = [0] 输出:[0] 提示:
- 两个链表的节点数目范围是 [0, 50]
- -100 <= Node.val <= 100
- l1 和 l2 均按 非递减顺序 排列
代码和结果图如下:
/**
* 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(ListNode l1, ListNode l2) {
if (l1 == null) return l2;
if (l2 == null) return l1;
ListNode res= l1.val < l2.val ? l1:l2;
res.next=mergeTwoLists(res.next, l1.val >= l2.val ? l1 : l2);
return res;
}
}

26. 删除有序数组中的重复项
给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。 由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。将最终结果插入 nums 的前 k 个位置后返回 k 。不要使用额外的空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
判题标准: 系统会用下面的代码来测试你的题解:
int[] nums = [...]; // 输入数组
int[] expectedNums = [...]; // 长度正确的期望答案
int k = removeDuplicates(nums); // 调用
assert k == expectedNums.length;
for (int i = 0; i < k; i++) {
assert nums == expectedNums;
}如果所有断言都通过,那么您的题解将被 通过。
示例 1:
输入:nums = [1,1,2] 输出:2, nums = [1,2,_] 解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。
示例 2:
输入:nums = [0,0,1,1,1,2,2,3,3,4] 输出:5, nums = [0,1,2,3,4] 解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。 提示:
- 1 <= nums.length <= 3 * 104
- -104 <= nums <= 104
- nums 已按 升序 排列
代码和结果图如下:
class Solution {
public int removeDuplicates(int[] nums) {
int p=0,q=1;
while (q<nums.length) {
if (nums[p] == nums[q]) {
q++;
} else {
nums[++p] = nums[q++];
}
}
return p+1;
}
}

27. 移除元素
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
说明: 为什么返回数值是整数,但输出的答案是数组呢? 请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。 你可以想象内部操作如下:
// nums 是以“引用”方式传递的。也就是说,不对实参作任何拷贝
int len = removeElement(nums, val);
// 在函数里修改输入数组对于调用者是可见的。
// 根据你的函数返回的长度, 它会打印出数组中 该长度范围内 的所有元素。
for (int i = 0; i < len; i++) {
print(nums);
}示例 1:
输入:nums = [3,2,2,3], val = 3 输出:2, nums = [2,2] 解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。 示例 2:
输入:nums = [0,1,2,2,3,0,4,2], val = 2 输出:5, nums = [0,1,4,0,3] 解释:函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。注意这五个元素可为任意顺序。你不需要考虑数组中超出新长度后面的元素。 提示:
- 0 <= nums.length <= 100
- 0 <= nums <= 50
- 0 <= val <= 100
代码和结果图如下:
class Solution {
public int removeElement(int[] nums, int val) {
int count=0;
for (int i = 0; i < nums.length; i++) {
if(nums!=val){
nums[count]=nums;
count+=1;
}
}
return count;
}
}

35. 搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。
示例 1:
输入: nums = [1,3,5,6], target = 5 输出: 2 示例 2:
输入: nums = [1,3,5,6], target = 2 输出: 1 示例 3:
输入: nums = [1,3,5,6], target = 7 输出: 4 提示:
- 1 <= nums.length <= 104
- -104 <= nums <= 104
- nums 为 无重复元素 的 升序 排列数组
- -104 <= target <= 104
代码和结果图如下:
class Solution {
public int searchInsert(int[] nums, int target) {
int len=nums.length;
for (int i = 0; i < len; i++) {
if(nums>=target){
return i;
}
}
return len;
}
}

58. 最后一个单词的长度
给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。
示例 1:
输入:s = &#34;Hello World&#34; 输出:5 解释:最后一个单词是“World”,长度为5。 示例 2: 示例 2:
输入:s = &#34; fly me to the moon &#34; 输出:4 解释:最后一个单词是“moon”,长度为4。 示例 3:
输入:s = &#34;luffy is still joyboy&#34; 输出:6 解释:最后一个单词是长度为6的“joyboy”。 提示:
- 1 <= s.length <= 104
- s 仅有英文字母和空格 &#39; &#39; 组成
- s 中至少存在一个单词
代码和结果图如下:
class Solution {
public int lengthOfLastWord(String s) {
s = s.trim();
int end = s.lastIndexOf(&#34; &#34;) + 1;
int length = s.substring(end).length();
return length;
}
}

<hr/>
总结
这几道算法题主要是采用Java基础遍历和链表,字符串的功能知识来实现的,比较简单,这是刷leetcode的第二天,希望大家多多鼓励,让我们一起坚持下来,一起加油 ! ! ! |
|