内容正文:
1.合并两个有序链表
题目描述
将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4,1->3->4
输出:1->1->2->3->4->4
前置知识
。递归
千锋学习站小程序
·链表
思路
信搜索
本题可以使用递归来解,将两个链表头部较小的一个与剩下的元素合并,并返回排好序的链表
头,当两条链表中的一条为空时终止递归。
关键点
获取更
掌握链表数据结构
考虑边界情况
代码
内部资
JS Code:
/**
Definition for singly-linked list.
function ListNode(val){
this.val val;
this.next null;
*/
/米*
@param
fListNode}11
@param {ListNode}12
@return {ListNode}
*/
const mergeTwoLists function (11,12){
if(11==null){
return 12;
if (12 ===null){
return 11;
3
if (11.val 12.val){
11.next mergeTwoLists(11.next,12);
return 11;
else
12.next mergeTwoLists(l1,12.next);
return 12;
3
复杂度分析
M、N是两条链表1、2的长度
·时间复杂度:O(M+N)
·空间复杂度:O(M+N)
获取更多微信搜索:千锋学习站小程序
扩展
。
你可以使用迭代的方式求解么?
迭代的CPP代码如下:
class Solution
public:
ListNode*mergeTwoLists(ListNode*a,ListNode*b){
ListNode head,*tail =&head;
while (a &b){
if (a->val <=b->val){
tail->next a;
a a->next;
else
tail->next b;
3
tail tail->next;
tail->next=a?a:b;
return head.next;
迭代的JS代码如下:
var mergeTwoLists function (11,12){
const prehead new ListNode(-1);
let prev prehead;
whi1e(111=nu11&121=nu11){
if (11.val <=12.val){
prev.next 11;
L1=11.ne×t;
else
prev.next 12;
12=12.next
prev prev.next;
prev.next 11 ==
return prehead.next;
欲取更之仪信搜索干锋学习站小程序
2.括号生成
目描达
数字代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且有效的括号组合。
示例:
输入:n=3
输出:[
"(O)",
"(OO)",
"(O)O",
"OO0"
前置知识
·DFS
·回溯法
思路
本题是20.有效括号的升级版。
站小程序
由于我们需要求解所有的可能,因此回溯就不难想到。回溯的思路和写法相对比较固定,并且
回溯的优化手段大多是剪枝。
不难想到,如果左括号的数目小于右括号,我们可以提前退出,这就是这道题的剪枝。比如
()·,后面就不用看了,直接退出即可。回溯的退出条件也不难想到,那就是:
·左括号数目等于右括号数目
。左括号数目+右括号数目=2*n
信搜索
由于我们需要剪枝,因此必须从左开始遍历。
(WHY?
因此这道题我们可以使用深度优先搜索(回溯思想),从空字符串开始构造,做加法,即ds(左
括号数,右括号数目,路径),我们从dfs(0,0,")开始。
伪代码:
res=▣
def dfs(l,r,s):
if 1n or r n:return
if (=r ==n):res.append(s)
#剪枝,提高算法效率
if 1 <r:return
#加一个左括号
dfs(1+1,r,s+'(')
#加一个右括号
dfs(1,r+1,s+)')
dfs(0,0,)
return res
四」寸1y甲yH叉工,凶此%J儿而陬胡Sy地件。仁正曰小文为TT牙a百口yy陕,W
需要注意撤销S的选择了。类似:
s.push_back(')');
dfs(1,r+1,s);
s.pop_back();
关键点
·当I<r时记得剪枝
代码
JS Code:
/米*
米
@param {number}n
*@return{[stringl☐]
*@param 1左括号已经用了几个
*@param r右括号已经用了几个
米@param str当前递归得到的拼接字符串结果
微信搜索:千锋学习站小程序
*@param res结果集
*/
nc;1。,4e孕6
const generateParenthesis
(n)f
const res=☐g
1f(1=n&r并ny
return res.push(str);
/1小于P同不满足条件剪枝
if (lsry
return;
3△◇
/人1小于n时可以插入左括号,最多可以插入n个
if (l<n)f
dfs(1+1,r,stp+"(");
//n<1时可以插入右括号
if(r<1)[
dfs(1,r+1,str+")")
Mu八wyw)
return res;
3
复杂度分析
·时间复杂度:O(2^N)
·空间复杂度:O(2N)
3.合并K个排序链表
题目描述
示例:
输入:
1->4->5,
1->3->4,
2->6
输出:1->1->2->3->4->4->5->6
获取更多微信搜索:
前置知识
海
·链表
思路
这道题目是合并k个已排序的链表,号称leetcode目前最难的链表题。和之前我们解决的
88.merge-sorted-array很像。
他们有两点区别:
1.这道题的数据结构是链表,那道是数组。这个其实不复杂,毕竟都是线性的数据结构。
4,心世达而女口开人1儿杀,P烂则八而女口T州!。心1正州送口y天姓在刀刚,世正心烂恐
难度为hard的原因。
因此我们可以看出,这道题目是88.merge--sorted-array的进阶版本。其实思路也有点像,我
们来具体分析下第二条。
如果你熟悉合并排序的话,你会发现它就是合并排序的一部分。
具体我们可以来看一个动画
千锋学习站小程序
数信搜索
白分斜中道
(动画来自htps://zhuanlan.zhihu.com/p/61796021)
关键点解析
获取更
·分治
。归并排序(merge sort)
代码
部资
JavaScript Code:
/米
@lc app=leetcode id=23 lang=javascript
米
[23]Merge k Sorted Lists
https://leetcode.com/problems/merge-k-sorted-lists/description/
*/
function mergeTwoLists(11,12){
const dummyHead =
let current dummyHead;
/11:1->3->5
/12:2->4->6
while (11 !=null &12 !=null){
if (11.val 12.val){
current.next=l1;//把小的添加到结果链表
current=current.next;//移动结果链表的指针
11=11.next;/移动小的那个链表的指针
else
current.next =12;
current current.next;
12 12.next;
if (11 ===null)f
current.next 12;
else
current.next 11;
return dummyHead.next;
/*来
获取更多微信搜索:千锋学习站小程序
Definition for singly-linked
function ListNode(val){
this.val val;
this.next null;
米3
*/
/米米
米
@param {ListNode[]}lists
@return [ListNode]
*/
var mergeKLists function (lists){
//图参考,https:/zhuanlan.zhihu.com/p/61796021
if (lists.length ==0)return null;
if (lists.length ==1)return lists[];
if (lists.length =2){
return mergeTwoLists(lists[],lists[1]);
const mid lists.length >1;
const11=☐;
for (let i=0;i<mid;i++){
const12=☐;
for (let i mid,j=0;i<lists.length;i++,j++){
12[j]=lists[i];
return mergeTwoLists(mergeKLists(11),mergeKLists(12));
}
复杂度分析
·时间复杂度:O(km*logk)
。空间复杂度:O(logk)
相关题目
88.merge-sorted-array
千锋学习站小程序
皮道颗其实可以用性来做,感兴趣的同学发索:】
扩展
4.两两交换链表中的节点
题目描述
获取
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
1(2
2
3
示例1:
输入:head=[1,2,3,4]
输出:[2,1,4,3]
示例2:
输入:head=[☐
输出:☐
示例3:
输入:head=[1]
输出:[1]
提示:
0<=Node.val <=100
获取更多微信搜索:千锋学习站小程序
链表中节点的数目在范围[0,100]内
前置知识
·链表
思路
部资料
设置一个dummy节点简化操作,dummy next指向head。
1.初始化first为第-个节点
2.初始化second为第二个节点
3.初始化current为dummy
4.first.next second.next
5.second.next first
6.current.next second