六六六六六六
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站上找了學習視頻看,怕聽不懂就從頭開始看了,老師講的還是很不錯的。聽著很有興趣。不過以后是不是要開始刷中等的題了,看了幾眼感覺好難啊。

浙公網安備 33010602011771號