Leetcode题解(六)
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题解(六)的更多相关文章
- 【LeetCode题解】二叉树的遍历
		
我准备开始一个新系列[LeetCode题解],用来记录刷LeetCode题,顺便复习一下数据结构与算法. 1. 二叉树 二叉树(binary tree)是一种极为普遍的数据结构,树的每一个节点最多只有 ...
 - leetcode题解-122买卖股票的最佳时期
		
题目 leetcode题解-122.买卖股票的最佳时机:https://www.yanbinghu.com/2019/03/14/30893.html 题目详情 给定一个数组,它的第 i 个元素是一支 ...
 - 【LeetCode题解】3_无重复字符的最长子串(Longest-Substring-Without-Repeating-Characters)
		
目录 描述 解法一:暴力枚举法(Time Limit Exceeded) 思路 Java 实现 Python 实现 复杂度分析 解法二:滑动窗口(双指针) 思路 Java 实现 Python 实现 复 ...
 - 【LeetCode题解】225_用队列实现栈(Implement-Stack-using-Queues)
		
目录 描述 解法一:双队列,入快出慢 思路 入栈(push) 出栈(pop) 查看栈顶元素(peek) 是否为空(empty) Java 实现 Python 实现 解法二:双队列,入慢出快 思路 入栈 ...
 - 【LeetCode题解】232_用栈实现队列(Implement-Queue-using-Stacks)
		
目录 描述 解法一:在一个栈中维持所有元素的出队顺序 思路 入队(push) 出队(pop) 查看队首(peek) 是否为空(empty) Java 实现 Python 实现 解法二:一个栈入,一个栈 ...
 - 【LeetCode题解】844_比较含退格的字符串(Backspace-String-Compare)
		
目录 描述 解法一:字符串比较 思路 Java 实现 Python 实现 复杂度分析 解法二:双指针(推荐) 思路 Java 实现 Python 实现 复杂度分析 更多 LeetCode 题解笔记可以 ...
 - 【LeetCode题解】25_k个一组翻转链表(Reverse-Nodes-in-k-Group)
		
目录 描述 解法一:迭代 思路 Java 实现 Python 实现 复杂度分析 解法二:递归(不满足空间复杂度) 思路 Java 实现 Python 实现 复杂度分析 更多 LeetCode 题解笔记 ...
 - 【LeetCode题解】24_两两交换链表中的节点(Swap-Nodes-in-Pairs)
		
目录 描述 解法一:迭代 思路 Java 实现 Python 实现 复杂度分析 解法二:递归(不满足空间复杂度要求) 思路 Java 实现 Python 实现 复杂度分析 更多 LeetCode 题解 ...
 - 【LeetCode题解】347_前K个高频元素(Top-K-Frequent-Elements)
		
目录 描述 解法一:排序算法(不满足时间复杂度要求) Java 实现 Python 实现 复杂度分析 解法二:最小堆 思路 Java 实现 Python 实现 复杂度分析 解法三:桶排序(bucket ...
 - 【LeetCode题解】19_删除链表的倒数第N个节点(Remove-Nth-Node-From-End-of-List)
		
目录 描述 解法:双指针 思路 Java 实现 Python 实现 复杂度分析 更多 LeetCode 题解笔记可以访问我的 github. 描述 给定一个链表,删除链表的倒数第 n 个节点,并且返回 ...
 
随机推荐
- 【京东详情页】——原生js爬坑之标签页
			
一.引言 要做详情页的商品评价等5个li的标签页转换,效果如下: 二.实现原理 有一个特别的地方:上面五个li,但下面只有四个容器(table/div). 设计的目的:无论点哪个li,只有前四个div ...
 - AngularJS  -- Module (模块)
			
点击查看AngularJS系列目录 转载请注明出处:http://www.cnblogs.com/leosx/ 什么是AngularJS的模块 我们所说的模块,是你的AngularJS应用程序的一个组 ...
 - MySQL高级查询(一)
			
修改表 修改表名 语法: ALTER TABLE<旧表名> RENAME [TO] <新表名>; 添加字段 语法: ALTER TABLE 表名 ADD 字段名 数据类型 ...
 - Python基础知识总结
			
看了一个礼拜Python的书,断断续续的看了一大半.今天刚好没有课,想着也没什么事情干,就把这几天Python总结一下,都是一些基础知识 变量和对象的引用 在python中一切都是对象,不像C,jav ...
 - Linux入门(7) 脚本
			
1.宣告使用的shell为何 2.注明创建者 编写作用等 3.注释每一个功能函数 执行脚本 1.修改可执行权限 chmod 755 file.sh 2.sh file.sh 可以直接运行脚本 #!/b ...
 - asp.net web api 2.2 基础框架(带例子)
			
链接:https://github.com/solenovex/asp.net-web-api-2.2-starter-template 简介 这个是我自己编写的asp.net web api 2.2 ...
 - Docker 最常用的监控方案 - 每天5分钟玩转 Docker 容器技术(78)
			
当 Docker 部署规模逐步变大后,可视化监控容器环境的性能和健康状态将会变得越来越重要. 在本章中,我们将讨论几个目前比较常用的容器监控工具和方案,为大家构建自己的监控系统提供参考. 首先我们会讨 ...
 - M-定在下边的区域
			
1 效果 2 布局 3 样式
 - PDO浅谈之php连接mysql
			
一.首先我们先说一下什么是pdo? 百科上说 PDO扩展为PHP访问数据库定义了一个轻量级的.一致性的接口,它提供了一个数据访问抽象层,这样,无论使用什么数据库,都可以通过一致的函数执行查询和获取数 ...
 - MYSQL数据库45道练习题
			
--第一题查询Student表中的所有记录的Sname.Ssex和Class列.select Sname,Ssex,Class from Student;--第二题查询教师所有的单位即不重复的Depa ...