昨天刷过的2道题的相关知识点在这里总结一下。
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
//基本解法思路:设置指针 len1 和 len2 分别指向 nums1 和 nums2 的有数字尾部,从尾部值开始比较遍历,同时设置指针 len 指向 nums1 的最末尾,每次遍历比较值大小之后,则进行填充。
int len1 = m-1;
int len2 = n-1;
int len = m+n-1;
//条件:数组长度必须都大于或等于0
while(len1>=0 && len2>=0){
//比较nums1跟nums2的数组的数的大小,从尾部进行填充,并且利用判断语句对选中的部分进行进一步移动。 并且这是先赋值之后进行减位置操作,不会出现位置不对的情况
nums1[len--]= nums1[len1]>nums2[len2]? nums1[len1--]: nums2[len2--];
}
//若len2的先遍历完则不需要这步骤,也是最好的结果。若len1先被遍历完了,则把剩下的len2中,(肯定是比它小的)的部分补到最前面
System.arraycopy(nums2 , 0 , nums1 , 0 , len2+1);
//表示的是:把nums2加到nums1中,把nums2中剩下的,取位置0长度为len2+1,补到nums1中索引为0的位置。
}
}
这是自己最后写的解法跟注解。其中涉及一个知识点,数组的复制System.arraycopy。单独总结一下,之前没有见过
System.arraycopy(nums2 , 2 , nums1 , 0 , 3);
这个表示把数组2中的数据拷贝到数组1中。具体是这样的:从数组2中索引位置2开始,选取长度为3的那部分(也就是从数组2的索引位置2到位置4),填到数组1中索引为0的位置。
这里引入了一个新东西链表。它的最终解法如下
/**
* 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 deleteDuplicates(ListNode head) {
//把head的地址赋值给cur,因为是链表,最后返回的还是按照之间的顺序,所以head不能动,用一个cur来当指针,cur改变则head链表也随之改变。若只用head操作,只会返回最后一个值。
ListNode cur =head;
//做一个循环,直到循环到底。 前提就是当前跟后一个节点都不为空
while(cur !=null && cur.next !=null){
if(cur.val == cur.next.val){
cur.next = cur.next.next;
//即使出现8 8最后这2个相同点的情况,也能借用后一个点的null把最后一个8替换掉
}else{
//若当前与后一个节点值不同,则cur指针后移一位
cur=cur.next;
}
}
//返回头结点
return head;
}
}
这里面涉及的新知识点:
1.链表的当前节点值表示为cur.val; 它的下一个位置写为 cur.next ; 下下一个位置为cur.next.next;
下一个位置的值表示为 cur.next.val;
2.整理出一个新链表的常规思路:把头指针head赋值到cur上,之后就让cur帮忙把这些事情解决,解决完了再返回head,返回head也是为了按照链表的正确顺序生成新链表。