生命不息,折腾不止
Hello,大家好!
这是LeetCode刷题实录的第一期,今天的这道题目是合并两个有序链表,在LeetCode中是第二十一题,欢迎大家在看完题解以后直接去上手做一下,毕竟看的再多也不如自己去实操一下,可能有些同学在在做这道题之前,并不知道链表这种数据结构是什么样子,在这先给大家介绍一下什么是链表。
链表大致可以分为单链表,双向链表,循环链表
那对链表的定义是什么呢?
链表是由一组不必相连【不必相连:可以连续也可以不连续】的内存结构 【节点】,按特定的顺序链接在一起的抽象数据类型。
再简单用一句话概括可以为:
一个对象指向对另外一个对象的引用
具体可看下图:
到这现在大家应该对链表有了一定的了解了,废话不多说,现在开始今天的题目。
题目描述:
合并有序链表(Merge Two Sorted Lists)
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4输出:1->1->2->3->4->4
题目解析:
首先分析题目,题中给出的关键条件是有序,并且两个链表的长度是不固定的,可能会出现的情况是一个链表有多个,另外一个链表直接为空。因为两个链表是有序的,所以就直接比较两个链表的头结点,谁更小就将谁放在前面。做这道题的时候就是一直进行比较,那个更小就放在前面,在比较过程中,如果有一方为空,剩下的链表就可以直接拼接到结果链表之后(因为有序)
这道题可以有两种题解:一种是递归,另外一种是迭代
递归结题法:
① 使用递归,首先要知道递归的终止条件是什么,这道题的终止条件就是当两条链表中的其中一个为空的时候结束循环。则设两条链表分别名为 l1
和 l2
,当 l1
为空或 l2
为空时结束
② 递归的内容是,比较l1
和l2
的节点值,如果l1
更小,则返回l1
,l1.next
和l2
继续比较,l2
原理同。
代码实现:
迭代解题法:
①使用迭代去解题的好处是更容易理解题目,使用迭代去解题的终止条件同样是有一方为空时,结束循环。
②在迭代过程中去创建一个哑结点,使用哑结点来连接已经排序好的链表,最后返回哑结点下一个引用。使用while循环链表,当有一方链表为空,则将剩余链表拼接到已经排序好的链表后,结束循环。
代码实现:
END