《剑指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; } }
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; } }
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; } }
--树
26树的子结构
遍历头结点、遍历左子树、遍历右子树。首先按照A和B的值是否相等划分为两种情况:一是判断头结点及左右结点是否都相等,返回true;二是判断B是不是A的左子结构或者是右子结构,返回true。在递归循环终止条件中只要B为null了,则证明遍历完成返回true。如果A为null了,B不为null则可以判定A未完全包含B。
27二叉树的镜像
28对称的二叉树
29
算法
--贪心
--动态规划