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. 15 Validation

    一.模型选择问题 如何选择? 视觉上 NO 不是所有资料都能可视化;人脑模型复杂度也得算上 通过Ein NO 容易过拟合;泛化能力差 通过Etest NO 能保证好的泛化,不过往往没法提前获得测试资料 ...

  2. Linux之不得不说的init(Linux启动级别的含义 init 0-6)

    init 0:关机: init 1:单用户模式(只root进行维护): init 2:多用户 init 3:完全多用户 init 4:安全模式 init 5:图形化 init 6:重启 可以在/etc ...

  3. Codeforces Round #410 (Div. 2)C. Mike and gcd problem

    题目连接:http://codeforces.com/contest/798/problem/C C. Mike and gcd problem time limit per test 2 secon ...

  4. java数据库编程之事务、视图、索引、备份、恢复

    第五章:事务.视图.索引.备份和恢复 5.1:事务 事务的概念:事务(transcation)是讲一系列数据操作捆绑成为一个整体进行统计管理. 如果某一事务执行成功了,则该事务进行操作的所有数据将会提 ...

  5. linux备份文件脚本

    #!/bin/sh #Author: Opal TODAY=`date +%Y%m%d` YESTERDAY=`date -d"-1 day" +%Y%m%d` mkdir -p ...

  6. 关于修改extmail附件大小限制的位置

    一.修改extmail的webmail.cf文件, SYS_MESSAGE_SIZE_LIMIT = 5242880 注意:以位为单位为5M字节. SYS_MESSAGE_SIZE_LIMIT = x ...

  7. Hexo + GitHub Pages搭建博客

    搭建 Node.js 环境 为什么要搭建 Node.js 环境? – 因为 Hexo 博客系统是基于 Node.js 编写的 Node.js 是一个基于 Chrome V8 引擎的 JavaScrip ...

  8. C#泛型基础知识点总结

    1.0  什么是泛型 泛型是C#2.0和CLR(公共语言运行时)升级的一个新特性,泛型为.NET 框架引入了一个叫 type parameters(类型参数)的概念,type parameters 使 ...

  9. Bootstrap table 元素列内容超长自动折行显示方法?

    共需要四步: 1.在table元素的父容器div加上:class="table-responsive" 3.设置表头th的width:<th width="20%& ...

  10. Block使用的简单总结

    一.Block简单的使用 1.block当作参数来传递 如下定义一个没有返回值无参数的block,并把它作为参数,让系统调用,注意:这里是系统在调用,不是我们调用 那么为什么需要把block当作参数去 ...