算法和数据结构[题目 线性表]

线性表[数组] #

Top K问题 : 数组中最小的 k 个数 #

方法一: 堆, 时间复杂度 O(n log k) 方法二: 快排变形, (平均)时间复杂度 O(n)

数组中最小的 k 个数:Top K 问题的两种经典解法

LeetCode 88 #

  • 题目
    合并有序数组 [简单]

  • Solution
    LeetCode 88

    • 方法一:直接合并后排序
    • 方法二:双指针
    • 方法三:逆向双指针

Leetcode 283. #

  • 题目
    移动零

LeetCode 540 #

线性表[链表] #

Leetcode 2 #

LeetCode21 #

  • 题目
    合并两个有序链表 [简单]

  • Solution

public class ListNode {
      int val;
      ListNode next;
      ListNode(int x) { val = x; }
}

class Solution {
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        ListNode dummyHead = new ListNode(0);
        ListNode lastNode = dummyHead;
        while (l1 != null && l2 != null) {
            if (l1.val < l2.val) {
                lastNode.next = l1;
                l1 = l1.next;
            } else {
                lastNode.next = l2;
                l2 = l2.next;
            }
            
            lastNode = lastNode.next;
        }
        lastNode.next = l1 != null ? l1 : l2;
        return dummyHead.next;
    }
}

LeetCode题解21_合并两个有序链表 LeetCode21:合并两个有序链表

LeetCode206 #

  • 题目
    单链表的反转 [简单]

  • Solution

    • 使用3个指针遍历单链表,逐个链接点进行反转。 复杂
    • 从第2个节点到第N个节点,依次逐节点插入到第1个节点(head节点)之后,最后将第一个节点挪到新表的表尾。 容易理解
public static Node reverseList(Node node) {
  Node pre = null;
  Node next = null;
  while (node != null) {
      next = node.next;
      node.next = pre;
      pre = node;
      node = next;
  }
  return pre;
}

剑指 题16 理解单链表的反转(java实现) LeetCode206:反转链表

快指针,慢指针 #

  • 链表中环的检测

    1. 硬解
    2. 每走一步,把节点的地址存在set中,走下一步的时候查找地址是否已经在set中
    3. 快指针是慢指针的两倍, 最后快指针和慢指针相遇
  • 链表倒数第k个结点

剑指 题15 题解: 快指针先于慢指针走若干步

在O(1)时间删除链表结点 #

剑指Offer

  • 最常规的做法是从链表的头结点开始,顺序遍历查找要删除的结点,并在链表中删除该结点。 这种思路由于需要顺序查找,时间复杂度自然就是O(n)。
  • 然而,可以把下一个结点的内容复制到需要删除的结点上覆盖原有的内容,再把下一个结点删除, 就相当于把当前需要删除的结点删除了,这样的时间复杂度是O(1)。

线性表[栈,队列] #

Leetcode 20 #

  • 题目
    有效的括号[简单]
  • Solution 题解:辅助栈

Leetcode 155 #

  • 题目
    包含min函数的栈 [简单]

  • Solution

    • 剑指 21题 , 指南 P1
    • 题解:方法一:辅助栈

Leetcode 225 #

Leetcode 232 #

  • 题目
    两个栈实现一个队列 [简单]

  • Solution

剑指 7题,指南 P5

用数组来实现栈 #

用数组来实现栈

参考 #

  • 《剑指 offer》
  • 《程序员代码面试指南》

  1. 数据结构与算法之美 - 07链表(下):如何轻松写出正确的链表代码? 王争
  2. 面试精选:链表问题集锦 ***

 算法面试通关40讲  覃超
  1. 06.面试题:反转一个单链表&判断链表是否有环
  2. 07.理论讲解:堆栈&队列
  3. 10.理论讲解:优先队列