0
点赞
收藏
分享

微信扫一扫

算法题总结(一)

捡历史的小木板 2022-04-21 阅读 51
c++面试

按照数据结构分类

(一) 链表问题

1、 反转链表

递归——空间复杂度、时间复杂度均为O(N);
迭代——空间复杂度为O(1)、时间复杂度为O(N)

(1) 反转整个链表

在这里插入图片描述

(2) 反转链表前k个数在这里插入图片描述

(3) 反转链表的一部分在这里插入图片描述

(4) 链表中的节点每k个一组翻转

  • 栈。存入栈,从栈中取出

2、 合并两个排序的链表

  • 递归:最重要的要明白递归函数的功能。可以不必关心递归函数的具体实现。
  • 迭代:一般创建单链表,都会设一个虚拟头结点,也叫哨兵,因为这样每一个结点都有一个前驱结点。ListNode *vhead = new ListNode(-1);

3、 合并K个排序数组

  • 在合并两个排序的链表的基础上完成

4、 判断链表中是否有环

  • 快慢指针,快指针走两步,慢指针走一步;相遇则有环,否则无环;

5、 给一个长度为n链表,若其中包含环,请找出该链表的环的入口结点

  • 快慢指针,在判断链表中是否有环的基础上做

6、 返回链表中倒数最后k个节点

  • 快慢指针,第一个指针先移动k步,然后第二个指针再从头开始,这个时候这两个指针同时移动,当第一个指针到链表的末尾的时候,返回第二个指针即可

7、 删除链表的倒数第k个节点

  • 快慢指针

8、 两个链表的第一个公共节点

  • 双指针

9、 链表相加

  • 反转链表再相加,再反转

10、 单链表的排序

  • 链表->数组->链表

11、 给定一个链表,请判断该链表是否为回文结构

  • 链表->数组->链表;
  • 或者是把链表反转再比对;

12、 链表的奇偶节点重排序

  • 设一个链表指针evenhead=head->next,两个链表指针odd=head、even=evenhead->next;
  • 最后返回head。因为odd、head指的是同一个链表的地址,所以一个变了,另一个也变

13、 删除给出链表中的重复元素(链表中元素从小到大有序)

  • 暴力解法
 if(nhead->val==nhead->next->val){
 	 	nhead->next=nhead->next->next;  
 	 }         
 else nhead=nhead->next;

14、 给出一个升序排序的链表,删除链表中的所有重复出现的元素

  • 新建一个链表存储不重复的元素:当前节点的值!=前一节点的值&&!=后一节点的值&&!=新建节点当前的值;
  • 最后一个节点不等于前一个节点的值即可
举报

相关推荐

0 条评论