LeetCode 合并两个有序链表
合并两个有序链表(Merge Two Sorted Lists)是LeetCode中比较基础的一道题目,也是面试中经常出现的问题,本文将分几个部分对这道题进行详细的讲解和分析。
- 题目描述
题目描述如下:
将两个升序链表合并为一个新的升序链表,并返回新链表。
输入:
l1 = [1,2,4], l2 = [1,3,4]
输出:
[1,1,2,3,4,4]
- 思路分析
简化题意,将两个有序链表合并成一个新的升序链表。
从这个题目可以看出,两个链表都是升序的,为了使合并后的链表也是升序的,我们可以采用双指针法解决这个问题。
定义两个指针,一个指针指向l1,另一个指针指向l2,然后比较两个指向节点的值的大小,将较小的节点加入到新链表中,同时移动相应的指针,重复这个过程直到有一个链表为空,然后将另一个链表剩余的节点加入到新链表中即可。
- 代码实现
下面是代码实现的Java版本:
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode merged = new ListNode(0); // 新链表的头节点
ListNode tail = merged; // 指向新链表最后一个节点的指针
while (l1 != null && l2 != null) { // 比较两个链表的节点值
if (l1.val < l2.val) {
tail.next = l1;
l1 = l1.next;
} else {
tail.next = l2;
l2 = l2.next;
}
tail = tail.next;
}
if (l1 != null) { // 将剩余节点添加到新链表中
tail.next = l1;
}
if (l2 != null) {
tail.next = l2;
}
return merged.next;
}
这段代码中,定义了一个新链表的头节点(merged)和一个指向新链表最后一个节点的指针(tail),然后遍历两个有序链表,比较当前两个链表节点的大小,将较小的节点接到新链表的尾部,并移动相应的链表指针,最后将剩余的节点拼接到新链表中。
- 时间复杂度
时间复杂度是O(m+n),其中m和n分别为两个有序链表的长度,因为每个节点最多只会被遍历一次。
- 总结
通过本篇文章,我们可以学习到在LeetCode中,如何用Java实现合并两个有序链表,以及双指针法的思路和应用。在实际面试中,需要掌握此类链表相关的算法,以便更好地应对面试。