每日算法(第十期)

news/2024/11/15 4:08:31/

2023年5月26日

先来回顾一下昨天的面试题及答案:

「合并两个有序链表」(Merge Two Sorted Lists)。

题目描述:将两个升序链表合并为一个新的升序链表并返回。新链表应该通过拼接给定的两个链表的节点组成。

例如,给定链表1: 1->2->4,链表2: 1->3->4,将它们合并为新的链表:1->1->2->3->4->4。

以下是对应的JavaScript实现:

function mergeTwoLists(l1, l2) {// 创建一个哑节点作为合并后链表的头节点const dummy = new ListNode(-1);let curr = dummy;// 比较两个链表的节点值,将较小值的节点连接到合并后链表的尾部while (l1 !== null && l2 !== null) {if (l1.val <= l2.val) {curr.next = l1;l1 = l1.next;} else {curr.next = l2;l2 = l2.next;}curr = curr.next;}// 处理其中一个链表已遍历完的情况if (l1 !== null) {curr.next = l1;}if (l2 !== null) {curr.next = l2;}return dummy.next; // 返回合并后链表的头节点
}

解题思路:

  • 创建一个哑节点作为合并后链表的头节点,并用一个指针 curr 指向当前合并后链表的尾节点。

  • 比较两个链表的节点值,将较小值的节点连接到合并后链表的尾部,并将对应链表的指针向后移动。

  • 当其中一个链表已遍历完时,将另一个链表的剩余部分直接连接到合并后链表的尾部。

  • 返回合并后链表的头节点,即哑节点的下一个节点。

时间复杂度:遍历两个链表的所有节点,时间复杂度为 O(m+n),其中 m 和 n 分别为两个链表的长度。

空间复杂度:只使用了常量级别的额外空间,因此空间复杂度为 O(1)。

例如:

// 构造链表节点
function ListNode(val) {this.val = val;this.next = null;
}// 构造链表
function createLinkedList(arr) {const dummy = new ListNode(-1);let curr = dummy;for (let i = 0; i < arr.length; i++) {curr.next = new ListNode(arr[i]);curr = curr.next;}return dummy.next;
}// 打印链表
function printLinkedList(head) {let curr = head;const result = [];while (curr !== null) {result.push(curr.val);curr = curr.next;}console.log(result.join("->"));
}const l1 = createLinkedList([1, 2, 4]);
const l2 = createLinkedList([1, 3, 4]);const mergedList = mergeTwoLists(l1, l2);
printLinkedList(mergedList); // 1->1->2->3->4->4

在上述例子中,给定两个链表 l1 和 l2,分别为 1->2->4 和 1->3->4。通过调用 mergeTwoLists 函数,将两个链表合并为一个新的升序链表。最终得到的合并后链表为 1->1->2->3->4->4。

2023年5月27日

给定 n 个非负整数 a1,a2,...,an,代表坐标中的 n 个点 (i, ai)。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

上面问题的答案会在第二天的公众号推文中公布,大家可以关注公众号:程序员每日三问,第一时间获得推送内容。

学习不打烊,充电加油只为遇到更好的自己,每天早上9点纯手工发布面试题(死磕自己,愉悦大家) 希望大家在这浮夸的程序员圈里保持冷静,每天坚持花20分钟来学习与思考,在千变万化,类库层出不穷的今天,不要等到找工作时才狂刷题,提倡每日学习。


http://www.ppmy.cn/news/93979.html

相关文章

在Flask中构建API接口

重定向行为 斜杠 以下两个路由的不同之处在于是否使用尾部的斜杠。 第一个路由的URL尾部有一个斜杠&#xff0c;看起来就像一个文件夹&#xff0c;访问一个没有斜杠结尾的URL时&#xff0c;Flask会自动进行重定向&#xff0c;在结尾加上一个斜杠。 第二个路由的URL没有尾部…

在VIVADO下烧写ZC706板载FLASH的操作步骤

1&#xff0c;原理图分析 首先看原理图&#xff0c;我们兼容ZC706的板子有两片 FLASH&#xff0c;型号是S25FL128A,连接方式如下&#xff1a; 可以看到两片是分别接在了XC7Z045芯片的引脚上&#xff0c;是互不相干的并联方式&#xff0c;每个FLASH芯片支持X4模式&#xff0c;也…

2、Ubuntu下安装mosquitto

1、mosquitto库是什么 mosquitto是一款实现了消息推送协议 MQTT v3.1 的开源消息代理软件&#xff0c;提供轻量级的&#xff0c;支持可发布/可订阅的的消息推送模式&#xff0c;使设备对设备之间的短消息通信变得简单。 在实验中使用mosquitto库函数来实现订阅与发布。 mosquit…

代码随想录算法训练营day53 | 1143.最长公共子序列,1035.不相交的线,53. 最大子序和 动态规划

代码随想录算法训练营day53 | 1143.最长公共子序列&#xff0c;1035.不相交的线&#xff0c;53. 最大子序和 动态规划 1143.最长公共子序列解法一&#xff1a;动态规划 1035.不相交的线解法一&#xff1a;动态规划 53. 最大子序和 动态规划解法一&#xff1a;动态规划解法二&am…

Systrace系列9 —— MainThread 和 RenderThread 解读

本文是介绍 Android App 中的 MainThread 和 RenderThread,也就是大家熟悉的主线程和渲染线程。文章会从 Systrace 的角度来看 MainThread 和 RenderThread 的工作流程,以及涉及到的相关知识:卡顿、软件渲染、掉帧计算等。 这里以滑动列表为例 ,我们截取主线程和渲染线程一…

vite的使用

私人博客 许小墨のBlog —— 菜鸡博客直通车 系列文章完整版&#xff0c;配图更多&#xff0c;CSDN博文图片需要手动上传&#xff0c;因此文章配图较少&#xff0c;看不懂的可以去菜鸡博客参考一下配图&#xff01; 系列文章目录 前端系列文章——传送门 后端系列文章——传送…

一文读懂:什么是数组

大家好&#xff0c;我是三叔&#xff0c;很高兴这期又和大家见面了&#xff0c;一个奋斗在互联网的打工人。 什么是数组 Java是一种面向对象的编程语言&#xff0c;提供了许多数据结构来处理和组织数据。其中&#xff0c;数组是一种常见且强大的数据结构&#xff0c;是存放在…

递归的基本概念

分类&#xff1a; 直接递归 间接递归 如果递归函数中调用递归的语句为最后一个执行语句&#xff0c;则称这种递归为尾递归 递归使用条件 原问题可以划为一个或多个子问题&#xff0c;且子问题的求解方式与原问题相同&#xff0c;只是数量规模不同 递归的调用次…