leetcode收获(20,21,26,27,28)
Stack<Character> stack=new Stack<>();//声明栈对象
stack.empty();//boolean类型,判断栈空与否
20、有效的括号
自己的思路:使用栈
空字符串合法,奇数位的字符串不合法,遇到左括号就压入栈,遇到右括号就将栈顶元素弹出来与右括号进行匹配,全部匹配并且栈空就是有效的括号串。
学到的思路:使用栈
遇到左括号就压入与之对应的右括号,遇到右括号就弹出栈顶元素判断是否相等,所有符号判断之后栈空就是有效的括号串。
21、合并两个有序链表
①递归:
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if(l1 == null)return l2;
else if(l2 == null)return l1;
else if(l1.val >= l2.val) {l2.next = mergeTwoLists(l1,l2.next); return l2;}
else {l1.next = mergeTwoLists(l1.next,l2); return l1;}
}
②迭代:设置哨位节点,设置循环(循环次数为两个链表长度的最小值),然后从两个链表的头开始,寻找最小的节点,连续接在哨位节点所在的链表上,循环结束后,将未连在新链表上的节点直接接在新链表上。
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {//哨位节点
ListNode prehead = new ListNode(-1);
ListNode prev = prehead;
while(l1 !=null && l2 !=null){
if(l1.val >= l2.val) {prev.next = l2; l2 = l2.next;}
else {prev.next = l1; l1 = l1.next;}
prev = prev.next;
}
prev.next = l1 == null ? l2 : l1;/////////////////////////////
return prehead.next;
}
}
26、删除排序数组中的重复项
27、移除元素
双指针法:
class Solution { public int removeDuplicates(int[] nums) { if (nums.length == 0) return 0; int i = 0; for (int j = 1; j < nums.length; j++) { if (nums[j] != nums[i]) { i++; nums[i] = nums[j]; } } return i + 1; } }
class Solution {
public int removeElement(int[] nums, int val) {
int i = 0;
for (int j = 0; j < nums.length; j++) {
if (nums[j] != val) {
nums[i] = nums[j];
i++;
}
}
return i;
}
}
28、kmp算法