从尾到头打印链表、合并两个排序的链表、验证回文字符串(二)(最多删除一个的情况)


一、剑指 Offer 06. 从尾到头打印链表

  1. 使用栈先遍历一遍,然后再弹出即可
  2. 这个dummyhead可加可不加,但是为了习惯还是加上吧
    public int[] reversePrint(ListNode head) {
        LinkedList<Integer> list = new LinkedList<>();
        ListNode dummyhead = new ListNode();
        dummyhead.next = head;
        ListNode cur = head;
        while(cur!=null){
            list.add(cur.val);
            cur = cur.next;
        }
        int[] result = new int[list.size()];
        for(int i=0;i<result.length;i++){
            result[i] = list.removeLast();
        }
        return result;
    }

15分钟

二、剑指 Offer 25. 合并两个排序的链表

  1. 使用一个虚拟头结点来做合并后的虚拟头结点。
  2. cur节点不断向后遍历。只要有一个是空,就退出,然后全盘接收另一个节点。
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        ListNode dummyhead = new ListNode();
        ListNode cur = dummyhead;
        ListNode cur1 = l1;
        ListNode cur2 = l2;
        while(cur1!=null&&cur2!=null){
        //这里想得是只要有一个是空,那么就退出,后面再加上那个非空的节点。
            if(cur1.val>cur2.val){
                cur.next=cur2;
                cur2 = cur2.next;
                cur = cur.next;
            } else{
                cur.next = cur1;
                cur1 = cur1.next;
                cur = cur.next;
            }
        }
        if(cur1!=null) cur.next=cur1;
        if(cur2!=null) cur.next=cur2;
        return dummyhead.next;
    }

20分钟

三、NC371 验证回文字符串(二)

https://www.nowcoder.com/practice/130e1a9eb88942239b66e53ec6e53f51?tpId=196&tqId=40502&ru=/exam/oj
在这里插入图片描述

  1. 首先一个最基本的验证回文字符串,使用双指针。如果两边不相等,则直接返回false,如果到最后,则返回true
  2. 用一点贪心,如果两边不相等了,试一下删除左节点或删除右节点。
    public boolean palindrome (String str) {
        int left = 0;
        int right = str.length()-1;
        while (left <= right) {
            if (str.charAt(left) == str.charAt(right)) {
                left++;
                right--;
            } else{
                return ishuiwen(str,left+1,right)||ishuiwen(str,left,right-1);
            }
        }
        return true;
    }
    public boolean ishuiwen(String str, int left, int right) {
        while (left <= right) {
            if (str.charAt(left) == str.charAt(right)) {
                left++;
                right--;
            } else {
                return false;
            }
        }
        return true;
    }

20分钟

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值