一般是面试的热身题——LeetCode题目21:合并两个有序链表
时间:2022-07-23
本文章向大家介绍一般是面试的热身题——LeetCode题目21:合并两个有序链表,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
原题描述
+
将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
原题链接:https://leetcode-cn.com/problems/merge-two-sorted-lists
思路解析
+
记得在研究生阶段,参加百度校招的第二面时被面了这道题。当时还挺惊讶的,因为这道题几乎毫无难度,在纸上写这道题的时候我就在想,面试官是不是要出什么幺蛾子,事实证明我的担心是对的,因为他后面把这道题改了一下让我继续做。至于改版的题目我在之后的文章会讲。
现在回到这道题目,思路很简单:
- 先创建一个哑结点(头结点),它将指向合并的新链表;
- 使用两个指针指向两个链表表头,不断相互比较,每次取较小的节点进行合并,然后对应的指针后移,不断重复这个过程;
- 大概率有一个链表先遍历完,这种情况直接把未遍历完的剩余链表节点直接合并即可。
我想提几个点:
- 题目是合并已有的链表,千万千万别自己创造新的链表;
- 遇到链表的题目请优先考虑创建哑结点,这很方便。
好了,现在动手写写吧~
复杂度分析
+
- 时间复杂度:
- 空间复杂度:
计算步骤
+
1. 初始声明哑结点(头结点)
2. 比较p和q指向的值,优先连接值较小的节点;
3. 将上述刚刚被连接的节点指针后移一步,继续比较,连接,直到某个链表被完全遍历;
此处省略若干步,直到下面的状态;
4. 最后,将未被完全遍历链表的剩余部分直接相连即可。
C++参考代码
+
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode* head = new ListNode(-1);
ListNode *p1 = l1, *p2 = l2, *q = head;
int val = 0;
while (p1 != NULL && p2 != NULL) {
if (p1->val <= p2->val) {
q->next = p1;
p1 = p1->next;
} else {
q->next = p2;
p2 = p2->next;
}
q = q->next;
}
q->next = p1 != NULL ? p1 : p2;
return head->next;
}
};
- JDBC基础入门(1)
- LeetCode——Add Two Numbers
- python 中numpy基本方法总结可以类推tensorflow
- python基础知识——函数
- tensorflow之tf.placeholder 与 tf.Variable区别对比
- 11g备库搭建碰到自己给自己埋的坑(r7笔记第63天)
- JDBC基础入门(2)
- 11g备库无法开启ADG的原因分析 (r7笔记第62天)
- JDBC基础入门(3)
- Python多元线性回归-sklearn.linear_model,并对其预测结果评估
- python 聚类分析实战案例:K-means算法(原理源码)
- JAVA面试题解惑——final、finally和finalize的区别
- Java内存管理
- python基础知识——内置数据结构(字典)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- PHP rmdir()函数的用法总结
- thinkphp5修改view到根目录实例方法
- openCV提取图像中的矩形区域
- PHP二维索引数组的遍历实例分析【2种方式】
- Selenium及python实现滚动操作多种方法
- PHP使用JPGRAPH制作圆柱图的方法详解
- PHP 实现超简单的SESSION与COOKIE登录验证功能示例
- PHP 图像处理与SESSION制作超简单验证码的方法示例
- 简述PHP7.4 新特性和废弃的功能
- laravel5.1框架下的批量赋值实现方法分析
- Laravel框架环境与配置操作实例分析
- 记Laravel调用Gin接口调用formData上传文件的实现方法
- Laravel框架视图和模型操作方法分析
- 接口测试框架实战(六) | 配置的数据驱动
- PHP连续签到功能实现方法详解