数据结构和算法练习
典型的递归问题,解决递归问题的关键
- 1.找到递归的公式
- 2.找出递归的退出条件,防止内存溢出
针对此题,爬楼梯要么是1步,要么是2步,所以递归公式为f(n-1)+f(n-2),当只有一个台阶时,有一种走法, 当有两种台阶时,有两种走法,所以退出条件为f(1)=1和f(2)=2
解题思路:
- 开辟新的临时数组tmp,
- 分别为原有两个数组的最后一个index设置指针i和j,
- 如果A[i]<B[j],那么就把A[j]放到tmp,反之,则把A[i]放到tmp,这叫做双指针解法
发现刷题重在思路,这道题首先要确定“链表相交”的概念,链表A和链表B相交与D,那么从D往后的链表都是相同的, 因为他们共用的next指针,假定两个指针分别指向两个链表的头结点,链表A指针从头走到尾,然后再从链表B头开始走,相同的速度, 相同的路径,所以两个链表会相遇
链表是一种天然的动态数据结构,何谓动态,就是可以增加数据,对比数组,数组是静态的,当然此处说的并不是数组的包装函数ArrayList
链表是由n个节点组成的,而节点中包含数据元素和指针,指针指的就是数据元素存放在内存中的地址,那如何将某个数存到该内存上呢? 通过
a.next = b
表明将a指针指向b,意思是将b放到了叫做a的内存地址上,而
b = a.next
意思是指将a的内存地址等于b 再看反转链表这道题,引入两个指针pre和cur,pre是新添加指针,作为头结点的前继节点,cur作为当前节点,然后不断遍历当前节点,并将 cur指针指向后继节点,原cur节点作为pre,一直遍历到cur为空
我咋没想到用递归呢?通过题解中的图就能明白如何解了
比较两个链表的头结点,如果a小于b,则将a指向剩下的部分,同时a链表后移一位
如果a为空,则证明a被遍历完全,则返回b
发现链表的题差不多都一个套路
- 创建空的节点作为哨兵或者哑结点指向头结点
- 用两个指针移动 此题就是这样,指针a先移动,当距指针b n个单位时,同时后移,当a为空时,就证明b移到了需要删除指针的前一个指针
1.一个指针用来指向head,作为奇链表,一个指针作为偶链表,也指向head, 一个指针用来暂存head,作为偶链表的head,然后分别排奇链表,偶链表 2.奇指针的下下指针指向奇数,偶的下下指向偶数 3.循环跳出条件:指针为空时