21、Merge Two Sorted Lists

题目

直接上代码:

class Solution {
public:
ListNode *mergeTwoLists(ListNode *l1, ListNode *l2) {
ListNode *helper=new ListNode();
ListNode *head=helper;
while(l1 && l2)
{
if(l1->val<l2->val) helper->next=l1,l1=l1->next;
else helper->next=l2,l2=l2->next;
helper=helper->next;
}
if(l1) helper->next=l1;
if(l2) helper->next=l2;
return head->next;
}
};

-------------------------------------------------------------------------------------------分割线---------------------------------------------------------------------------------

22、Generate Parentheses

题目

题目分析:

在构造这个括号字符串时,分别用left和right表示剩下的左括号和右括号个数,str表示已经构造出的字符串。通过分析,可以找出如下关系:

a.当left==right时,只能进行str+‘(’操作;

b.当left<right并且left != 0,可以进行str+')'或者str+‘(’操作,相应的符号个数将减少1;

c.当left>right,这种情况肯定不存在;

实现代码如下:

 class Solution {
public:
vector<string> generateParenthesis(int n) {
vector<string> res;
string str="";
generateParenthesis(res,n,n,str); return res; }
void generateParenthesis(vector<string> &res,int left,int right,string str)
{
if( == left)
{
for(int i=;i<right;i++)
str += ')'; res.push_back(str);
return;
}
else
{
if(left == right)
generateParenthesis(res,left-,right,str+'(');
else
{
generateParenthesis(res,left-,right,str+'(');
generateParenthesis(res,left,right-,str+')');
}
}
}
};

上面的实现过程是递归实现,既然能用递归,那就能通过使用stack的方式直接求解而不用递归。

非递归的方法:每次stack压栈压入一个三元组(left,righ,str)。

 struct node
{
node(int l,int r,string s)
{
left = l;
right = r;
str = s;
}
int left;
int right;
string str;
}; class Solution {
public:
vector<string> generateParenthesis(int n) {
vector<string> res;
string str="";
stack< node* > mystack;
int l = n-;
int r = n; node *temp = new node(l,r,"(");
mystack.push(temp);
while(!mystack.empty())
{
temp = mystack.top();
mystack.pop();
if(temp->left == )
{
for(int i=;i<temp->right;i++)
temp->str += ')';
res.push_back(temp->str);
continue;
}
if(temp->left == temp->right)
{
mystack.push(new node(temp->left -,temp->right,temp->str+'('));
}
else
{
mystack.push(new node(temp->left -,temp->right,temp->str+'('));
mystack.push(new node(temp->left,temp->right - ,temp->str+')'));
}
}
return res; }
};

----------------------------------------------------------------------------------------------分割线------------------------------------------------------------------------------

23、Merge k Sorted Lists

题目

这道题目可以仿照21题,一次对每一个链表就行merge,也就是L0和L1进行merge,得到的结果再和L2进行Merge。代码如下:

 class Solution {
public:
ListNode* mergeKLists(vector<ListNode*>& lists) {
int count = lists.size();
int i=;
if(lists.empty())
return NULL;
ListNode* first,*second,*temp;
first = lists[];
for (;i<count;i++)
{
temp = mergeTwoLists(first,lists[i]);
first = temp;
}
return first;
}
ListNode *mergeTwoLists(ListNode *l1, ListNode *l2) {
ListNode *helper=new ListNode();
ListNode *head=helper;
while(l1 && l2)
{
if(l1->val<l2->val) helper->next=l1,l1=l1->next;
else helper->next=l2,l2=l2->next;
helper=helper->next;
}
if(l1) helper->next=l1;
if(l2) helper->next=l2;
return head->next;
}
};

但是,这样提交的话,会超时。不能通过。

对算法进行改进,首先L0和L1进行Merge,L2和L3进行Merge。。。如此循环,把得到的结果再Merge,直到最后得出结果。

代码如下:

 class Solution {
public:
ListNode* mergeKLists(vector<ListNode*>& lists) {
int count = lists.size();
int i=;
if(lists.empty())
return NULL;
queue<ListNode*> myque;
ListNode* first,*second,*temp;
first = lists[];
for (;i+<=count;i+=)
{
temp = mergeTwoLists(lists[i],lists[i+]);
myque.push(temp);
}
if(i<count)
myque.push(lists[i]);
while (!myque.empty())
{
first = myque.front();
myque.pop();
if(myque.empty())
return first;
second = myque.front();
myque.pop();
temp = mergeTwoLists(first,second);
myque.push(temp); }
return first;
}
ListNode *mergeTwoLists(ListNode *l1, ListNode *l2) {
ListNode *helper=new ListNode();
ListNode *head=helper;
while(l1 && l2)
{
if(l1->val<l2->val) helper->next=l1,l1=l1->next;
else helper->next=l2,l2=l2->next;
helper=helper->next;
}
if(l1) helper->next=l1;
if(l2) helper->next=l2;
return head->next;
}
};

Leetcode题解(六)的更多相关文章

  1. 【LeetCode题解】二叉树的遍历

    我准备开始一个新系列[LeetCode题解],用来记录刷LeetCode题,顺便复习一下数据结构与算法. 1. 二叉树 二叉树(binary tree)是一种极为普遍的数据结构,树的每一个节点最多只有 ...

  2. leetcode题解-122买卖股票的最佳时期

    题目 leetcode题解-122.买卖股票的最佳时机:https://www.yanbinghu.com/2019/03/14/30893.html 题目详情 给定一个数组,它的第 i 个元素是一支 ...

  3. 【LeetCode题解】3_无重复字符的最长子串(Longest-Substring-Without-Repeating-Characters)

    目录 描述 解法一:暴力枚举法(Time Limit Exceeded) 思路 Java 实现 Python 实现 复杂度分析 解法二:滑动窗口(双指针) 思路 Java 实现 Python 实现 复 ...

  4. 【LeetCode题解】225_用队列实现栈(Implement-Stack-using-Queues)

    目录 描述 解法一:双队列,入快出慢 思路 入栈(push) 出栈(pop) 查看栈顶元素(peek) 是否为空(empty) Java 实现 Python 实现 解法二:双队列,入慢出快 思路 入栈 ...

  5. 【LeetCode题解】232_用栈实现队列(Implement-Queue-using-Stacks)

    目录 描述 解法一:在一个栈中维持所有元素的出队顺序 思路 入队(push) 出队(pop) 查看队首(peek) 是否为空(empty) Java 实现 Python 实现 解法二:一个栈入,一个栈 ...

  6. 【LeetCode题解】844_比较含退格的字符串(Backspace-String-Compare)

    目录 描述 解法一:字符串比较 思路 Java 实现 Python 实现 复杂度分析 解法二:双指针(推荐) 思路 Java 实现 Python 实现 复杂度分析 更多 LeetCode 题解笔记可以 ...

  7. 【LeetCode题解】25_k个一组翻转链表(Reverse-Nodes-in-k-Group)

    目录 描述 解法一:迭代 思路 Java 实现 Python 实现 复杂度分析 解法二:递归(不满足空间复杂度) 思路 Java 实现 Python 实现 复杂度分析 更多 LeetCode 题解笔记 ...

  8. 【LeetCode题解】24_两两交换链表中的节点(Swap-Nodes-in-Pairs)

    目录 描述 解法一:迭代 思路 Java 实现 Python 实现 复杂度分析 解法二:递归(不满足空间复杂度要求) 思路 Java 实现 Python 实现 复杂度分析 更多 LeetCode 题解 ...

  9. 【LeetCode题解】347_前K个高频元素(Top-K-Frequent-Elements)

    目录 描述 解法一:排序算法(不满足时间复杂度要求) Java 实现 Python 实现 复杂度分析 解法二:最小堆 思路 Java 实现 Python 实现 复杂度分析 解法三:桶排序(bucket ...

  10. 【LeetCode题解】19_删除链表的倒数第N个节点(Remove-Nth-Node-From-End-of-List)

    目录 描述 解法:双指针 思路 Java 实现 Python 实现 复杂度分析 更多 LeetCode 题解笔记可以访问我的 github. 描述 给定一个链表,删除链表的倒数第 n 个节点,并且返回 ...

随机推荐

  1. python 部署 Restful web

    使用python web做Restful 风格,很简单,采用Flask框架轻松实现一个RESTful的服务. Restful相关介绍请查看:https://www.ibm.com/developerw ...

  2. 常见sql技巧

    一.一些常见的SQL实践 (1)负向条件查询不能使用索引 select * from order where status!=0 and stauts!=1 not in/not exists都不是好 ...

  3. PyTorch教程之Training a classifier

    我们已经了解了如何定义神经网络,计算损失并对网络的权重进行更新. 接下来的问题就是: 一.What about data? 通常处理图像.文本.音频或视频数据时,可以使用标准的python包将数据加载 ...

  4. 代码与编程(java基础)

    代码与编程(面试与笔试java) 1.写一个Singleton出来 Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在. 一般Singleton模式通常有几种种 ...

  5. Spring 具名参数NamedParameterJdbcTemplate

    具名参数: 具名参数:SQL 按名称(以冒号开头)而不是按位置进行指定. 具名参数更易于维护, 也提升了可读性. 具名参数由框架类在运行时用占位符取代 我们之前一直是用JDBCTemplate  进行 ...

  6. 移动端效果之Swiper

    写在前面 最近在做移动端方面运用到了饿了么的vue前端组件库,因为不想单纯用组件而使用它,故想深入了解一下实现原理.后续将会继续研究一下其他的组件实现原理,有兴趣的可以关注下. 代码在这里:戳我 1. ...

  7. Linux下将Apache(httpd)新增为系统服务及开机自启动

    1. 查看一下/etc/init.d/下是否存在httpd这个服务 ls /etc/init.d/ | grep httpd 如果没有执行下一步 2.将自己安装目录下的apachect1复制到该目录下 ...

  8. I/O输入输出流

    I/O(输入/输出) 在变量.数组和对象中存储的数据是暂时存在的,程序结束后它们就会消失.为了能够永久地保存创建的数据,需要将其保存在磁盘文件中,这样可以在其他程序中使用它们. Java的I/O技术可 ...

  9. eclipse的插件开发-启动时间

    今天晚上看<深入理解java虚拟机>时,作者在书中有一段,eclipse优化的章节,其中涉及到了eclipse启动时间检测的插件开发 于是翻了翻资料,也开发了一个自己的插件 如图是开发后启 ...

  10. bootstrap 响应式导航条模板(含下拉菜单,弹出框)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...