今天做 LeetCode 21. 合并两个有序链表,题目难度为 Easy。
一. 题目要求
给定两个有序链表,合并成一个有序链表。
例子
输入: 1->2->4, 1->3->4
输出: 1->1->2->3->4->4
二. 解题思路 & 代码
要将两个链表合并,遍历操作是肯定需要的,同时链表必须是有序链表,因此在遍历的过程中需要进行值的判断,以确定新链表中各个 Node 的顺序。
解题思路
- 1.比较 l1、l2 的头节点,将较小的节点作为合并后链表的头节点,合并完成后返回。
- 2.遍历两个链表,每次遍历进行比较,取较小的节点作为新链表的节点,其余的继续遍历,直到出现节点为空时,遍历结束。
- 3.判断 l1、l2 是否有不为空的情况,如果不为空,则将其添加到新链表的尾部。
具体实现代码如下:
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if (Objects.isNull(l1)) {
return l2;
}
if (Objects.isNull(l2)) {
return l1;
}
// 1. 选择头节点
ListNode head;
if (l1.val <= l2.val) {
head = l1;
}else {
head = l2;
}
// 2. 遍历
// 新链表的尾节点
ListNode tailNode = head;
while (l1 != null && l2 != null) {
if (l1.val <= l2.val) {
// 选择较小的节点,在进行链表变动之前必须先记录下其 next 节点
ListNode next = l1.next;
tailNode.next = l1;
l1 = next;
}else {
ListNode next = l2.next;
tailNode.next = l2;
l2 = next;
}
tailNode = tailNode.next;
}
// 3. 如果有还没有遍历的部分,将其加入到新链表尾部。
if (Objects.isNull(l1)) {
tailNode.next = l2;
}else {
tailNode.next = l1;
}
return head;
}
}
代码运行结果为:
- Runtime: 0 ms, faster than 100.00%
- Memory Usage: 39 MB, less than 19.53%
三. 解题后记
题目相对比较简单,关键还是要把遍历过程中如何比较、取节点想清楚。另外就是不要忘了两个链表的长度可能是不能的,一个遍历完了另一个可能还有未遍历的部分,要记得将这部分添加到新链表的尾部。
我是 AhriJ邹同学,前后端、小程序、DevOps 都搞的炸栈工程师。博客持续更新,欢迎小伙伴关注或与我私信交流,互相学习,共同进步。