LeetCode题解-链表标签:合并两个有序链表
题目:将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:
graph LR A[1]-->B[2] B[2]-->C[4]
graph LR A[1]-->B[3] B[3]-->C[4]
输出:
graph LR A[1]-->B[1] B[1]-->C[2] C[2]-->D[3] D[3]-->E[4] E[4]-->F[4]
思路:
已知条件:两个链表的头节点l1
和l2
。
对于两个升序链表,它们的长度不一定相等,当我们把较短的链表合并完成后,直接连接较长链表的剩余部分即可。
我们并不知道哪一个的头节点值更小,所以需要分类讨论。
递归法:
我们可以用如下的公式定义我们的递归merge
操作:
判断l1
和l2
哪一个链表的头节点值较小,将较小的那个节点的下一个节点与另一个链表进行递归merge
。
递归的出口:如果递归到l1[0]
或l2[0]
为null
时,直接返回另外一个链表。另外一个链表可能也为null
(如果原链表长度相等),或者非null
(原链表长度不等)。
单链表节点类定义可查看文章:数据结构之链表-基础知识
Java
语言实现如下:
1 | public static SinglyLinkedListNode mergeTwoSortedLinkedListRecursionImpl(SinglyLinkedListNode l1, |
迭代法:
正所谓所有的递归都可以转化成迭代。
由于待合并的两个链表都有序,合并后的头节点要么是l1
要么是l2
。如果我们不希望修改原来的链表,就需要构造出一个新链表,顺序连接两个原链表的各个节点。
首先,我们创建一个哨兵节点hair
,然后维护一个cur
指针,每次使用cur
指针去连接各个节点。我们依次比较l1
和l2
节点的值,如果l1
的值小于l2
,则用cur
连接l1
,然后l1
右移;否则,用cur
连接l2
,然后l2
右移。直到l1
或者l2
为null
,将另一个节点的剩余节点连接至cur
,然后再返回hair.next
,即为合并后链表的新头节点。
哨兵节点
hair
:指针域next
指向的节点即为合并后的链表的头节点。
Java
语言实现如下:
1 | public static SinglyLinkedListNode mergeTwoSortedLinkedList(SinglyLinkedListNode l1, |
-------------有过牵挂了无牵挂-------------
欢迎关注微信公众号【打工这件小事】~
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 打工这件小事!
评论