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;}
    }
扫描二维码关注公众号,回复: 9233537 查看本文章

②迭代:设置哨位节点,设置循环(循环次数为两个链表长度的最小值),然后从两个链表的头开始,寻找最小的节点,连续接在哨位节点所在的链表上,循环结束后,将未连在新链表上的节点直接接在新链表上。

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算法

猜你喜欢

转载自www.cnblogs.com/zhaoxuan8/p/12325043.html