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. IOS SDWebImage实现基本原理详解(转载)

    1)当我门需要获取网络图片的时候,我们首先需要的便是URl没有URl什么都没有,获得URL后我们SDWebImage实现的并不是直接去请求网路,而是检查图片缓存中有没有和URl相关的图片,如果有则直接 ...

  2. 用Atom打造简单的java编译器以及对于可能出现的问题解答

    如何用Atom打造简单的javaIDE 自己一直比较喜欢Atom编辑器,前段时间给Atom配置好了C/C++的运行环境,自己心里还是感觉挺好的,最近在学习java ,偶然的机会让我看到了一篇文章,就是 ...

  3. 01.python基础知识_01

    一.编译型语言和解释型语言的区别是什么? 1.编译型语言将源程序全部编译成机器码,并把结果保存为二进制文件.运行时,直接使用编译好的文件即可 2.解释型语言只在执行程序时,才一条一条的解释成机器语言给 ...

  4. Application->ProcessMessages();

    Application.ProcessMessages的用法意义   在循环中加Application.ProcessMessages是可以防止其他控件没响应,举个例子容易明白:假如你的窗体上有两个按 ...

  5. Dynamic Inversions II 逆序数的性质 树状数组求逆序数

    Dynamic Inversions II Time Limit: 6000/3000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Other ...

  6. String Problem hdu 3374 最小表示法加KMP的next数组

    String Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  7. 《算法导论》学习总结 — XX.第23章 最小生成树

    一.什么叫最小生成树 一个无向连通图G=(V,E),最小生成树就是联结所有顶点的边的权值和最小时的子图T,此时T无回路且连接所有的顶点,所以它必须是棵树. 二.为什么要研究最小生成树问题 <算法 ...

  8. Windows下memcached的安装配置

    下载windows 32位或64位 memcached 下载 memcached_dll 1.将第一个包解压放某个盘下面,比如在c:\memcached.2.在终端(也即cmd命令界面)下输入 'c: ...

  9. 【转】python time模块详解

    python 的内嵌time模板翻译及说明  一.简介 time模块提供各种操作时间的函数  说明:一般有两种表示时间的方式:       第一种是时间戳的方式(相对于1970.1.1 00:00:0 ...

  10. 百度地图JS调用示例

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...