1 题目描述

  输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

2 思路与方法

  迭代法:两个链表中较小的头结点作为合并后头结点,之后依次合并两个链表中较小的结点,以此类推,最终合并剩余结点; ListNode* out_list =s->Merge(l1,l4);

  递归法:两个链表中较小的头结点作为合并后头结点,递归;(不推荐递归)

3 C++核心代码

3.1 迭代实现

 /*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
{
ListNode* phead = new ListNode();
ListNode* list_new = phead;
while(pHead1 || pHead2){
if(pHead1==NULL){
list_new->next=pHead2;
break;
}
else if(pHead2==NULL){
list_new->next = pHead1;
break;
}
if((pHead1->val)>(pHead2->val))
{
list_new->next = pHead2;
list_new = list_new->next;
pHead2=pHead2->next;
}
else{
list_new->next = pHead1;
list_new = list_new->next;
pHead1=pHead1->next;
}
}
return phead->next;
}
};

3.2 递归实现

 /*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
{
if (!pHead1)
return pHead2;
if (!pHead2)
return pHead1; if (pHead1->val < pHead2->val)
pHead1->next = Merge(pHead1->next, pHead2);
else
pHead2->next = Merge(pHead1, pHead2->next); return pHead1->val < pHead2->val ? pHead1 : pHead2;
}
};

4 完整代码

 #include <iostream>

 using namespace std;

 struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
class Solution {
public:
ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
{
ListNode* phead = new ListNode();
ListNode* list_new = phead;
while (pHead1 || pHead2){
if (pHead1 == NULL){
list_new->next = pHead2;
break;
}
else if (pHead2 == NULL){
list_new->next = pHead1;
break;
}
if ((pHead1->val)>(pHead2->val))
{
list_new->next = pHead2;
list_new = list_new->next;
pHead2 = pHead2->next;
}
else{
list_new->next = pHead1;
list_new = list_new->next;
pHead1 = pHead1->next;
}
}
return phead->next;
}
};
int main()
{
Solution *s = new Solution();
//vector<int> v = { 2,4,6,1,3,5,7 };
ListNode *l1 = new ListNode();
ListNode *l2 = new ListNode();
ListNode *l3 = new ListNode();
ListNode *l4 = new ListNode();
ListNode *l5 = new ListNode();
ListNode *l6 = new ListNode();
ListNode *l7 = new ListNode();
l1->next = l2;
l2->next = l3;
//l3->next = l4;
l4->next = l5;
l5->next = l6;
l6->next = l7; ListNode* out_list = s->Merge(l1, l4);
while (out_list){
cout << out_list->val << " ";
out_list = out_list->next;
}
cout << endl; system("pause");
return ;
}

参考资料

https://blog.csdn.net/ansizhong9191/article/details/80697615

剑指offer16:输入两个单调递增的链表,合成后的链表满足单调不减规则。的更多相关文章

  1. 剑指Offer-16.合并两个排序的链表(C++/Java)

    题目: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 分析: 可以用一个新的节点,来去比较两个单调递增的链表当前节点的值,如果p1当前的值小于p2,则新 ...

  2. 剑指Offer-16:合并两个有序链表

    题目描述: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 例如A链表为1-3-5-7,B链表为2-4-6-8.所以合并后的新链表C为1-2-3-4-5- ...

  3. 合并两个有序链表(剑指offer-16)

    题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 解答方法1:递归 /* public class ListNode { int val; List ...

  4. 剑指Offer 合并两个排序的链表

    题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则.   思路: 用2个新节点,一个用来存放新链表的头节点,另一个用来移动.当p1,p2有一个到尾部的 ...

  5. 剑指OFFER——合并两个有序的链表

    输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 再做这道题就是想不起来书上怎么做的了,但是最近看STL里面全是这种基础的合并啊,比较啊.就算不会也看会了. ...

  6. 剑指offer——合并两个排序的链表——对象、引用和赋值初接触

    题目描述:输入两个单调递增的链表,输出两个链表合成后的链表,当然,我们需要合成后的链表满足单调不减规则. 先公布结果: /* public class ListNode { int val; List ...

  7. 剑指offer-合并两个排列的链接

    题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则.   public ListNode Merge(ListNode list1,ListNode ...

  8. 剑指Offer——合并两个排序的链表

    题目描述: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 分析: 苦力活,使用两个指针分别指向未被合并的两个链表的首部,比较两个首部数值的大小,合并数值 ...

  9. 剑指offer--23.合并两个排序的链表

    时间限制:1秒 空间限制:32768K 热度指数:421239 本题知识点: 链表 题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. class ...

随机推荐

  1. ios TCP抓包

    1.工具安装 Mac15.1 ,Xcode11.2.1 这一步有个小坑,我第一次执行rvictls -s 提示 rvictl: command not found.Stack Overflow上提供了 ...

  2. Python 自学笔记(一)

    1.打印函数 1-1.print()函数 1-1-1.引号的用法 一.单引号与双引号:直接输出 二.三引号:保留原来的格式 1-2.转义字符 转义字符是一种特殊的字符常量,在编程语言中,我们用转义字符 ...

  3. HTM概述

    Html: Hyper Text Markup Language 超文本标记语言 超文本: 超出纯文本的范畴 标记语言: 标记其实就是标签 标签的格式: <标签名称>

  4. php判断为空就插入,判断不为空就更新

    if ($_GET['tplname']!==null) { if ($userinfo[0] == ''){$exec="INSERT INTO cblej_company_pc_temp ...

  5. 阶段5 3.微服务项目【学成在线】_day03 CMS页面管理开发_10-修改页面-前端-修改页面

    1.进入页面,通过钩子方法请求服务端获取页面信息,并赋值给数据模型对象 2.页面信息通过数据绑定在表单显示 3.用户修改信息点击“提交”请求服务端修改页面信息接口 3.3.3 修改页面 3.3.3.1 ...

  6. Eclipse安装Spring Tools Suites

    第一种:离线安装 下载地址:较高版本 http://spring.io/tools/sts/all/ 比较低版本:http://spring.io/tools/ggts/all 选择适合自己Eclip ...

  7. Spring事务管理5-----声明式事务管理(3)

    声明式事务管理  基于注解 在配置文件中需要开启注解驱动<tx:annotation-driven transaction-manager="transactionManager&qu ...

  8. pyCharm最新2017激活

    pyCharm最新2017:下载地址 下载完成后安装软件 启动pyCharm,进入下面窗口 选择License server 在 server选项里边输入 http://elporfirio.com: ...

  9. java.lang.IllegalStateException: No primary or default constructor found for class java.time.LocalDate

    转载自:https://blog.csdn.net/Coder_Arley/article/details/81910705 springboot中报错如下: springmvc也可以使用类似处理方法 ...

  10. linux查看文件具体时间和大小

    查看具体时间 ll --full-time 查看文件大小: ll -ht 或者du -sh *