1 问题

合并2个已经排好序的链接,比如

1->3->5->7

2->4->6

合并后新的链表如下

1->2->3->4->5->6->7

2 代码实现

#include <stdio.h>
typedef struct Node
{int val;struct Node *next;
} Node;/**print list*/
void print_list(Node *head)
{if (head == NULL){printf("head is NULL\n");return;}Node *p = head;while (p != NULL){printf("value is %d\n", p->val);p = p->next;}
}/**合并链表*/
struct Node* merge(Node *head1, Node *head2)
{if (head1 == NULL){return head2;}if (head2 == NULL){return head1;}struct Node *new = NULL;if (head1->val < head2->val){new = head1;new->next = merge(head1->next, head2);}else {new = head2;new->next = merge(head1, head2->next);}return new;
}int main()
{//list1 0->3->5->9;Node head, node1, node2, node3;head.val = 0;head.next = &node1;node1.val = 3;node1.next = &node2;node2.val = 5;node2.next = &node3;node3.val = 9;node3.next = NULL;printf("list1 is such as\n");print_list(&head);//list2 1->4->6Node head1, node4, node5;head1.val = 1;head1.next = &node4;node4.val = 4;node4.next = &node5;node5.val = 6;node5.next = NULL;printf("list2 is such as\n");print_list(&head1);printf("merge list1 and list2\n");Node *new = merge(&head, &head1);print_list(new);return 0;
}

3 运行结果

list1 is such as
value is 0
value is 3
value is 5
value is 9
list2 is such as
value is 1
value is 4
value is 6
merge list1 and list2
value is 0
value is 1
value is 3
value is 4
value is 5
value is 6
value is 9

4 总结

我一开始写成这样了

struct Node* merge(Node *head1, Node *head2)
{if (head1 == NULL){return head2;}if (head2 == NULL){return head1;}struct Node *new = NULL;while (head1 != NULL && head2 != NULL) {if (head1->val < head2->val){new = head1;new->next = merge(head1->next, head2);}else {new = head2;new->next = merge(head1, head2->next);}}return new;
}

加了while循环 又是递归,肯定容易出问题,一定要记住,递归函数里面循环体里面又有递归一般就有问题

剑指offer之合并已排序链表(递归实现)相关推荐

  1. 《LeetCode力扣练习》剑指 Offer 25. 合并两个排序的链表 Java

    <LeetCode力扣练习>剑指 Offer 25. 合并两个排序的链表 Java 一.资源 题目: 输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的. 示例1: ...

  2. 剑指Offer:合并两个排序的链表【25】

    剑指Offer:合并两个排序的链表[25] 题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 题目分析 每次都是比较箭头节点,把小节点连接到已经合 ...

  3. LeetCode Algorithm 剑指 Offer 25. 合并两个排序的链表

    剑指 Offer 25. 合并两个排序的链表 Ideas 这题让我想到了归并排序: 划分问题:把序列分成元素个数尽量相等的两半: 递归求解:把两半元素分别排序: 合并问题:把两个有序表合并成一个. 捞 ...

  4. 【LeetCode】剑指 Offer 25. 合并两个排序的链表

    [LeetCode]剑指 Offer 25. 合并两个排序的链表 文章目录 [LeetCode]剑指 Offer 25. 合并两个排序的链表 一.递归 二.伪头节点 总结 一.递归 思路: 如果有一个 ...

  5. 剑指offer系列——剑指 Offer 25. 合并两个排序的链表

    ⭐️前面的话⭐️ 大家好!本篇文章将介绍关于数据结构之链表的OJ题,来自力扣:21. 合并两个有序链表 或 剑指 Offer 25. 合并两个排序的链表 题解,展示代码语言暂时为:Java语言与C语言 ...

  6. 【LeetCode】剑指 Offer 53 - I. 在排序数组中查找数字 I

    [LeetCode]剑指 Offer 53 - I. 在排序数组中查找数字 I 文章目录 [LeetCode]剑指 Offer 53 - I. 在排序数组中查找数字 I 一.二分法 总结 一.二分法 ...

  7. 剑指offer——面试题56:链表中环的入口

    剑指offer--面试题56:链表中环的入口 Solution1: 非常经典的快慢指针套路题.下面这个链接讲解的很详细.其实问题的关键在于为什么快指针的速度一定是慢指针的2倍,3倍或4倍行不行?? 快 ...

  8. 《剑指offer》刷题——【链表】从尾到头打印链表

    <剑指offer>刷题--[链表]-<从尾到头打印链表> 问题分析: 递归实现: 1. 无返回值 2. 有返回值(ArrayList) 问题分析: 从头到尾打印链表比较简单,那 ...

  9. 剑指 Offer II 027. 回文链表

    剑指 Offer II 027. 回文链表: 题目链接 :剑指 Offer II 027. 回文链表 题目:给定一个链表的 头节点 head ,请判断其是否为回文链表. 如果一个链表是回文,那么链表节 ...

最新文章

  1. Linux磁盘管理——df、du、磁盘分区、格式化、挂载、LVM
  2. C#题目及答案(1)
  3. 服务器热修复,热修复探究,hotfix,patch
  4. Page.RegisterClientScriptBlock和Page.RegisterStartupScript有何区别
  5. Angular提示文件不是一个有效的模块
  6. 专题之七:ckk拉链厂信息化实施记
  7. Hive复杂数据类型之array
  8. web前端制作网页步骤以及制作网页学习教程
  9. 欧拉角(转子动力学)
  10. linux系统中source什么意思,Linux中source是什么指令?
  11. Git GUI中文乱码解决问题
  12. 常见web漏洞修复方法
  13. 蛮力法 第5关:白帽子红帽子问题
  14. Echo的树莓派学习笔记
  15. 【微信小程序】不支持使用本地图片设置背景图片解决方法
  16. 我们分析了30,000个GitHub项目-以下是Java,JS和Ruby排名前100的图书馆
  17. 读《区块链革命》笔记与思考——金融服务领域将如何实现变革?
  18. 电感的参数化建模仿真与验证
  19. 西施失踪谜案:功成名就后被杀人灭口?
  20. 浅谈计算机系统仿真,浅谈计算机仿真技术

热门文章

  1. 在.Net环境下使用elasticsearch实现大数据量的搜索
  2. .NET 6新特性试用 | DateOnly和TimeOnly类型
  3. 总是想得太简单?试试我的方法
  4. Resharper 和 Rider 的奇淫技巧,你知道多少?
  5. Windows 11 操作系统最低硬件要求
  6. MySQL优化从执行计划开始(explain超详细)
  7. ASP VNext 开源服务容错处理库Polly
  8. Dotnet Core下的Channel, 你用了吗?
  9. 链路追踪在ERP系统中的应用实践
  10. 开源netcore前后端分离,前端服务端渲染方案