21 #合并两个有序链表
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
思路:设置一个新的链表,不断从l1和l2上找到较小的元素接在后面,生成新的有序链表。
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public ListNode mergeTwoLists(ListNode l1, ListNode l2) { ListNode dummyHead = new ListNode(0); ListNode cur = dummyHead; while(l1 != null && l2 != null){ if(l1.val<l2.val){ cur.next = l1; cur = cur.next; l1 = l1.next; } else{ cur.next = l2; cur = cur.next; l2 = l2.next; } } if(l1 == null){ cur. next = l2; } else cur.next = l1; return dummyHead.next; } }
26# 删除排序数组中的重复项
给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
思路:快慢双指针,一个指向已经找到的不重复的数字的末尾,一个指向原数组,找到不同的放在慢指针处,找到相同的则快指针继续向后移动。
class Solution { public int removeDuplicates(int[] nums) { if (nums==null||nums.length==1){ return nums.length; } else{ int i = 0,j = 1; while(j<nums.length){ if(nums[i]==nums[j]){ j++; } else{ i++; nums[i] = nums[j]; j++; } } return i+1; } } }
27# 移除元素
给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
思路:快慢指针
class Solution { public int removeElement(int[] nums, int val) { if(nums == null||(nums.length==1&&nums[0]!=val)) return nums.length; int j = 0; for(int i =0;i<nums.length;i++){ if(nums[i]!=val){ nums[j]=nums[i]; j++; } } return j; } }