合并两个有序链表(C语言)———链表经典算法题

 题目描述​​​​​​21. 合并两个有序链表 - 力扣(LeetCode):

答案展示:

迭代:

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {struct ListNode* newhead = malloc(sizeof(struct ListNode));newhead->next = list1;struct ListNode*pcur1 = newhead;//只要涉及两个对象将一个放到另一个中,及一定有一个到头另一个还没到的两种情况while (pcur1->next)//有两个就说明,有两种走到头的方式 {if(!list2){list2 = newhead->next;break;}if(pcur1->next->val>=list2->val){struct ListNode*tmp = pcur1->next;pcur1->next = list2;list2 = tmp;}pcur1 = pcur1->next;if(!pcur1->next){pcur1->next = list2;list2 = newhead->next;break;}}return list2;
}

递归:

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {if(!list1||!list2){if(list1){list1->next = mergeTwoLists(list1->next,list2);return list1;}else if(list2){list2->next = mergeTwoLists(list1,list2->next);return list2;}elsereturn NULL;}else{if(list1->val>=list2->val){list2->next = mergeTwoLists(list1,list2->next);return list2;}else{list1->next = mergeTwoLists(list1->next,list2);return list1;}}
}

官方递归:

class Solution {public ListNode mergeTwoLists(ListNode l1, ListNode l2) {if (l1 == null) {return l2;} else if (l2 == null) {return l1;} else if (l1.val < l2.val) {l1.next = mergeTwoLists(l1.next, l2);return l1;} else {l2.next = mergeTwoLists(l1, l2.next);return l2;}}
}作者:力扣官方题解
链接:https://leetcode.cn/problems/merge-two-sorted-lists/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

收获

  1. 这道题的情况很多,值得多复习训练。体现在尝试迭代时,我使用的方法是两链表相互交换,而对应的很多边界情况未能考虑周全,而后重试时,通过调换某些特殊变量的位置,同时添加判断才得以解决。另外,迭代还可以是创建一个哨兵位,直接遍历两个链表,进行尾插,还可以是每个链表使用三个指针遍历得出。
  2. 以后写完代码不论多自信是对的,都要在提交前最后走一遍逻辑
  3. 在尝试迭代方法时,为了避免冗余代码,长时间死磕,最后部分地方还是写的比较冗余,但通过学习官方题解确实让我眼前一亮,有些逻辑可以不用“直译”,也可以“意译”,如官解的前两个分支,就很好的解决了两个list都是NULL的情况,而我使用的则是直接将其提出额外做一个分支,可能有时候,可以先把一种情况不讨论,优先实现其他,最后在倒过头来发现,也解决了未考虑的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/685888.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【docker 】push 镜像到私服

查看镜像 docker images把这个hello-world 推送到私服 docker push hello-world:latest 报错了。不能推送。需要标记镜像 标记Docker镜像 docker tag hello-world:latest 192.168.2.1:5000/hello-world:latest 将Docker镜像推送到私服 docker push 192.168.2.1:5000/hello…

【吃透Java手写】2-Spring(下)-AOP-事务及传播原理

【吃透Java手写】Spring&#xff08;下&#xff09;AOP-事务及传播原理 6 AOP模拟实现6.1 AOP工作流程6.2 定义dao接口与实现类6.3 初始化后逻辑6.4 原生Spring的方法6.4.1 实现类6.4.2 定义通知类&#xff0c;定义切入点表达式、配置切面6.4.3 在配置类中进行Spring注解包扫描…

python中如何把list变成字符串

python中如何把list变成字符串&#xff1f;方法如下&#xff1a; python中list可以直接转字符串&#xff0c;例如&#xff1a; data ["hello", "world"] print(data1:,str(data)) 得到结果&#xff1a; (data1:, "[hello, world]") 这里将整个…

芋道----工作流中添加邮件通知

1、配置邮件发送的账号 2、编辑邮件的内容模板 如何新建邮箱&#xff0c;直接查看芋道官网即可&#xff0c;已经讲解的很详细了&#xff0c;可以直接点击下方链接 邮件配置 | ruoyi-vue-pro 开发指南 (iocoder.cn)https://doc.iocoder.cn/mail/#_3-1-%E6%96%B0%E5%BB%BA%E9%82…

Android项目转为鸿蒙,真就这么简单?

最近做了一个有关Android转换成鸿蒙的项目。经不少开发者的反馈&#xff1b;许多公司的业务都增加了鸿蒙板块。 对此想分享一下这个项目转换的流程结构&#xff0c;希望能够给大家在工作中带来一些帮助。转换流程示意图如下&#xff1a; 下面我就给大家介绍&#xff0c;Android…

26、Qt使用QFontDatabase类加载ttf文件更改图标颜色

一、图标下载 iconfont-阿里巴巴矢量图标库 点击上面的链接&#xff0c;在打开的网页中搜索自己要使用的图标&#xff0c;如&#xff1a;最大化 找到一个自己想用图标&#xff0c;选择“添加入库” 点击“购物车”图标 能看到刚才添加的图标&#xff0c;点击“下载代码”(需要…

手撕C语言题典——移除链表元素(单链表)

目录 前言 一.思路 1&#xff09;遍历原链表&#xff0c;找到值为 val 的节点并释放 2&#xff09;创建新链表 二.代码实现 1)大胆去try一下思路 2&#xff09;竟然报错了&#xff1f;&#xff01; 3&#xff09;完善之后的成品代码 搭配食用更佳哦~~ 数据结构之单…

双向链表(详解)

在单链表专题中我们提到链表的分类&#xff0c;其中提到了带头双向循环链表&#xff0c;今天小编将详细讲下双向链表。 话不多说&#xff0c;直接上货。 1.双向链表的结构 带头双向循环链表 注意 这几的“带头”跟前面我们说的“头节点”是两个概念&#xff0c;实际前面的在…

【机器学习与实现】线性回归分析

目录 一、相关和回归的概念&#xff08;一&#xff09;变量间的关系&#xff08;二&#xff09;Pearson&#xff08;皮尔逊&#xff09;相关系数 二、线性回归的概念和方程&#xff08;一&#xff09;回归分析概述&#xff08;二&#xff09;线性回归方程 三、线性回归模型的损…

vue开发网站—①调用$notify弹窗、②$notify弹窗层级问题、③js判断两个数组是否相同等。

一、vue中如何使用vant的 $notify&#xff08;展示通知&#xff09; 在Vue中使用Vant组件库的$notify方法来展示通知&#xff0c;首先确保正确安装了Vant并在项目中引入了Notify组件。 1.安装vant npm install vant --save# 或者使用yarn yarn add vant2.引入&#xff1a;在ma…

springboot整合redis多数据源(附带RedisUtil)

单数据源RedisUtil(静态) 单数据源RedisUtil,我这里implements ApplicationContextAware在setApplicationContext注入redisTemplate,工具类可以直接类RedisUtil.StringOps.get()使用 package com.vehicle.manager.core.util;import com.alibaba.fastjson.JSON; import lombok.e…

信息系统项目管理基础

目录 一、项目管理概论 1、定义 2、项目管理的十二原则 3、SMART原则 4、项目经理 5、项目的生命周期 二、项目立项管理 1、项目启动过程 三、项目整合管理 1、管理基础 2、项目整合管理过程 ①制定项目章程 ②制定项目管理计划 ③指导与管理项目工作 ④管理项目…