六六六六六六
83. 删除排序链表中的重复元素
给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。
示例 1:
输入:head = [1,1,2]输出:[1,2]
拿c的思路做了半天发现怎么写都不对,都是没有这个目标,最后受不了了去看了评论,原来是有专门函数的。我真的会谢,我听的课里为什么没有讲这种嘞!一直讲的都是思路。我还以为java里面链表没有特殊的函数,枯了
代码如下:
class Solution {
public ListNode deleteDuplicates(ListNode head) {
if(head==null||head.next==null) return head;
if(head.val==head.next.val){
head= deleteDuplicates(head.next);
}else {
head.next = deleteDuplicates(head.next);
}
return head;
}
}
88. 合并两个有序数组
给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。
请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。
注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-sorted-array
要求原地改造,所以小偷一波鸡,不过挺麻烦的,先把nums1中要排序的部分赋值给另一个数组,然后将两个数组在循环时比较直接放入nums1覆盖掉原先值即可。
代码如下:
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
if(m==0&&n!=0){
for(int i=0;i<n;i++){
nums1[i]=nums2[i];
}
}
if(n!=0&&m!=0){
int[] n1=new int[m];
int flag1=0;
int flag2=0;
for(int i=0;i<m;i++){
n1[i]=nums1[i];
}
for(int i=0;i<m+n;i++){
if(flag1==m){
nums1[i]=nums2[flag2];
flag2++;
continue;
}
if(flag2==n){
nums1[i]=n1[flag1];
flag1++;
continue;
}
if(n1[flag1]<=nums2[flag2]){
nums1[i]=n1[flag1];
flag1++;
}else{
nums1[i]=nums2[flag2];
flag2++;
}
}
}
}
}
看了评论区,发现一种非常简单的思路,就是把大的往后填充即可,代码如下:
public void merge(int[] nums1, int m, int[] nums2, int n) {
if(n == 0) return;
int i = n-- + m-- -1;
while(n > -1){
nums1[i--] = m < 0 || nums2[n] > nums1[m] ? nums2[n--] : nums1[m--];
}
}
看了一眼后续的简单题全部都是关于树的了,但是说实话只有个概念,特别是在java里,完全不知道怎么操作,所以在b站上找了学习视频看,怕听不懂就从头开始看了,老师讲的还是很不错的。听着很有兴趣。不过以后是不是要开始刷中等的题了,看了几眼感觉好难啊。