LeetCode Hot100题目解析:双指针合并有序链表(Java详细注释)

LeetCode Hot100题目解析:双指针合并有序链表(Java详细注释)

一、题目描述

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

示例:

输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]

二、解题思路详解

本题常见于面试,是链表基础题之一。我们可以用“双指针”技巧来解决。

步骤说明:

  1. 创建一个虚拟头节点dummy,简化链表操作。
  2. 用指针p1和p2,分别指向两个链表l1和l2的头部。
  3. 再用一个指针current指向新链表的最后一个节点(初始为dummy)。
  4. 比较p1和p2当前节点的值,把较小的节点接到current后面,同时对应指针向后移动。
  5. 重复上述过程,直到某个链表遍历完。
  6. 最后把未遍历完的链表直接接到新链表后面。
  7. 返回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,合并有序链表,数据结构

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值