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. 手机管家iPhoneX的适配总结

    WeTest 导读 随着苹果发布会的结束,Xcode的GM版也上线了,也意味着iPhoneX适配之旅的开始. 一.设计关注篇 注意设计的基本原则:(苹果呼吁的) 规格原帖:https://develo ...

  2. SQL性能优化十条经验(转)

    1.查询的模糊匹配 尽量避免在一个复杂查询里面使用 LIKE '%parm1%'-- 红色标识位置的百分号会导致相关列的索引无法使用,最好不要用. 解决办法: 其实只需要对该脚本略做改进,查询速度便会 ...

  3. Sublime Text 3 全程详细图文原创教程

    Sublime Text 3 全程详细图文原创教程(持续更新中...) 一. 前言 使用Sublime Text 也有几个年头了,版本也从2升级到3了,但犹如寒天饮冰水,冷暖尽自知.最初也是不知道从何 ...

  4. 基于 Electron 的爬虫框架 Nightmare

    作者:William 本文为原创文章,转载请注明作者及出处 Electron 可以让你使用纯 JavaScript 调用 Chrome 丰富的原生的接口来创造桌面应用.你可以把它看作一个专注于桌面应用 ...

  5. 【个人笔记】《知了堂》node.js简介及创建应用

    Node.js是什么? Node.js是建立在谷歌Chrome的JavaScript引擎(V8引擎)的Web应用程序框架.Node.js自带运行时环境可在Javascript脚本的基础上可以解释和执行 ...

  6. linux文件权限解析(摘)

    用户组 在linux中的每个用户必须属于一个组,不能独立于组外.在linux中每个文件有所有者.所在组.其它组的概念 - 所有者 - 所在组 - 其它组 - 改变用户所在的组 所有者 一般为文件的创建 ...

  7. Dubbo与Zookeeper、SpringMVC整合和使用

    作为dubbo框架初学者,能让框架跑起来非常不容易,非常感谢网上诸多大神提供的文章,本人参考文章地址是:https://my.oschina.net/xshuai/blog/891281 不过别人的记 ...

  8. [js高手之路] html5 canvas系列教程 - 开始路径beginPath与关闭路径closePath详解

    路径在canvas绘图中,经常被用到,是一个非常重要的概念. 比如:我们要在canvas画出3条直线,要求用不同的颜色加以区分. <style> body { background: #0 ...

  9. 优秀的CSS预处理----Less

    Less语法整理 本人邮箱:kk306484328@163.com,欢迎交流讨论. 欢迎转载,转载请注明网址:http://www.cnblogs.com/kk-here/p/7601058.html ...

  10. Linux入门之常用命令(4)vi编辑器

    vi分为三种模式 一般模式:删除字符.删除整行.复制粘贴等操作 编辑模式:i o a r进入 输入字符  Esc退出 命令行模式::或/ 将光标移动到最末行 搜寻数据 读取或替换 退出vi 显示行号 ...