这是我参与更文挑战的第18天,活动详情查看: 更文挑战
前言
力扣第二十一题 合并两个有序链表
如下所示:
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例1:
输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]
示例 2:
输入:l1 = [], l2 = []
输出:[]
示例 3:
输入:l1 = [], l2 = [0]
输出:[0]
一、思路
既然是合并两个升序链表,就可以很自然的想到使用迭代来进行合并了。大致的实现思路就是在遍历链表L1的过程中,将L1和L2链表中更小的值插入到新的链表中。如果L1遍历结束后L2不为空,则将L2的整个插入新链表。
来看一下具体的步骤吧,此处以示例1中的 l1 = [1,2,4], l2 = [1,3,4]
作为例子。
hear1:指向链表 L1 的头部
head2:指向链表 L2 的头部
插入新队列的原则:如 L1 中的元素小则加入链表,否则选择 L2 中的元素
图解
初始状态如下所示:
L1
的第一个元素 1
不小于 L2
中的元素 1
,则选择 L2 中的元素,head2 向后移动一位。如下图所示:
L1
后面的元素 1
和 2
均小于 L2
中的元素 3
,故 L1 中的 2 和 3 加入新链表。如下图所示:
L1
后面的元素 4
不小于 L2
中的 3
和 4
,故 L2 中的 3 和 4 加入新链表。如下图所示:
最后 L1
中最后一个元素 4 加入新链表。如下图所示:
相信通过上面的步骤解析,很清晰的就能知道如何通过迭代来合并有序链表了!
二、实现
代码实现
变量解释:
ret:结果集
temp:临时变量
tips:需要防止 L1 遍历完但 L2 还有元素和 L1 还没遍历完 L2 就没有元素了
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode ret = new ListNode();
ListNode temp = ret;
// 迭代
while (l1 != null && l2 != null) {
if (l1.val < l2.val) {
temp.next = new ListNode(l1.val);
l1 = l1.next;
} else {
temp.next = new ListNode(l2.val);
l2 = l2.next;
}
temp = temp.next;
}
// 将未遍历完的列表归入结果
if (l1 == null) {
temp.next = l2;
}
if (l2 == null)
temp.next = l1;
return ret.next;
}
复制代码
测试代码
public static void main(String[] args) {
ListNode l1 = new ListNode(1, new ListNode(2, new ListNode(4)));
ListNode l2 = new ListNode(1, new ListNode(3, new ListNode(4)));
new Number21().mergeTwoLists(l1, l2);
}
复制代码
结果
三、总结
感谢看到最后,非常荣幸能够帮助到你~♥