《剑指offer》思路整理(Java)

leetcode:https://leetcode-cn.com/problemset/lcof

数据结构

--数组

--链表

21

22链表中倒数第k个节点

class Solution {
    public ListNode getKthFromEnd(ListNode head, int k) {
        if(head == null && head.next ==null){
            return head;
        }
        //定义p、q指针指向head,p先向前走k步,接着p、q同时向前走,
        //当p指向null时,q指向的节点即为链表的倒数第k个节点。   
        ListNode p =head,q =head;
        while(k-- > 0){
            p = p.next;
        }
        while(p!=null){
            p =p.next;
            q =q.next;
        }
        return q;
    }
}
View Code

24反转链表

class Solution {
    public ListNode reverseList(ListNode head) {
        ListNode pre = null;
        ListNode p =head;
        //通过q为中间值实现前后节点反转
        while(p !=null){
            ListNode q= p.next;
            p.next =pre;
            pre = p;
            p=q;
        }
        return pre;
    }
}
View Code

25合并两个排序的链表

class Solution {
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        //先判断l1和l2是否为空,是则直接返回另一链表
        if(l1 == null){
            return l2;
        }

        if(l2==null){
            return l1;
        }

        //构造新的链表存放2个合并后的链表
        ListNode head = new ListNode(0);
        ListNode p =head;
        while(l1!=null && l2!=null){
            //如果l1的值比l2的小就先存放l1的值,注意节点的连接处理
            if(l1.val<l2.val){
                ListNode t = l1.next;
                p.next = l1;
                p = l1;
                l1=t;
            } else {
                ListNode t = l2.next;
                p.next = l2;
                p = l2;
                l2=t;
            }
        }
        //从l1/l2中补上不为空的末尾节点
        p.next=l1==null?l2:l1;
        return head.next;
    }
}
View Code

 

--树

26树的子结构

遍历头结点、遍历左子树、遍历右子树。首先按照A和B的值是否相等划分为两种情况:一是判断头结点及左右结点是否都相等,返回true;二是判断B是不是A的左子结构或者是右子结构,返回true。在递归循环终止条件中只要B为null了,则证明遍历完成返回true。如果A为null了,B不为null则可以判定A未完全包含B。

27二叉树的镜像

28对称的二叉树

29

 

算法

--贪心

--动态规划

posted @ 2020-07-01 23:14  codeg  阅读(110)  评论(0编辑  收藏  举报