LeetCode Hot100题目解析:双指针合并有序链表(Java详细注释)
一、题目描述
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]
二、解题思路详解
本题常见于面试,是链表基础题之一。我们可以用“双指针”技巧来解决。
步骤说明:
- 创建一个虚拟头节点dummy,简化链表操作。
- 用指针p1和p2,分别指向两个链表l1和l2的头部。
- 再用一个指针current指向新链表的最后一个节点(初始为dummy)。
- 比较p1和p2当前节点的值,把较小的节点接到current后面,同时对应指针向后移动。
- 重复上述过程,直到某个链表遍历完。
- 最后把未遍历完的链表直接接到新链表后面。
- 返回dummy.next即可。
形象理解:
- 就像用两把尺子量两个有序序列,每次取较小的那个拼接上去。
三、Java完整代码与详细注释
// 链表节点定义
class ListNode {
int val;
ListNode next;
ListNode() {}
ListNode(int val) { this.val = val; }
ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}
public class Solution {
/**
* 合并两个有序链表,返回合并后的有序链表头节点
* @param l1 第一个有序链表
* @param l2 第二个有序链表
* @return 合并后的有序链表
*/
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
// 创建虚拟头节点,简化操作
ListNode dummy = new ListNode(-1);
ListNode current = dummy;
// 双指针遍历两个链表
while (l1 != null && l2 != null) {
if (l1.val < l2.val) {
current.next = l1; // l1更小,接到新链表后
l1 = l1.next; // l1指针后移
} else {
current.next = l2;
l2 = l2.next;
}
current = current.next; // 新链表指针后移
}
// 处理剩余节点
if (l1 != null) {
current.next = l1;
} else {
current.next = l2;
}
// 返回合并后链表的头节点
return dummy.next;
}
}
代码说明:
- dummy节点用于简化链表操作,避免特殊情况。
- 每次比较两个链表的当前节点,取较小的接入新链表。
- 时间复杂度O(m+n),m和n为两个链表的长度。
四、小结
双指针技巧在链表合并等问题中非常实用,掌握本题有助于理解链表的基本操作和指针运用。
文章标签:LeetCode,算法,链表,双指针,Java,合并有序链表,数据结构