算法:21.升序链表合并

这篇博客介绍了如何将两个已按非递减顺序排列的升序链表合并为一个新的升序链表。提供了两种方法,一种是迭代方式,通过创建虚拟头节点和指针跟踪新链表的末尾,逐个比较节点并连接;另一种是递归方法,根据当前节点值选择较小节点作为新链表头节点,并递归处理剩余部分。
摘要由CSDN通过智能技术生成

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

示例 1:

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

示例 2:

输入:l1 = [], l2 = []
输出:[]

示例 3:

输入:l1 = [], l2 = [0]
输出:[0]

提示:

  • 两个链表的节点数目范围是 [0, 50]
  • -100 <= Node.val <= 100
  • l1 和 l2 均按 非递减顺序 排列
方法一:迭代
  1. 创建一个虚拟头节点(dummy node),并使用一个指针 current 来跟踪新链表的末尾。
  2. 遍历两个链表,比较当前节点的值,将较小的节点链接到新链表的末尾,并移动指针。
  3. 当一个链表遍历完后,直接将另一个链表剩余的部分链接到新链表的末尾。
  4. 返回虚拟头节点的下一个节点,即合并后的链表的头节点。

 

public class Solution {
    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.next;
            } else {
                current.next = l2;
                l2 = l2.next;
            }
            current = current.next;
        }
        
        // 将剩余的节点链接到新链表的末尾
        if (l1 != null) {
            current.next = l1;
        } else {
            current.next = l2;
        }
        
        // 返回虚拟头节点的下一个节点
        return dummy.next;
    }

    // 定义 ListNode 类
    public static class ListNode {
        int val;
        ListNode next;
        ListNode(int val) { this.val = val; }
    }

    public static void main(String[] args) {
        Solution solution = new Solution();

        // 创建链表 1->2->4
        ListNode l1 = new ListNode(1);
        l1.next = new ListNode(2);
        l1.next.next = new ListNode(4);

        // 创建链表 1->3->4
        ListNode l2 = new ListNode(1);
        l2.next = new ListNode(3);
        l2.next.next = new ListNode(4);

        // 合并链表
        ListNode mergedList = solution.mergeTwoLists(l1, l2);

        // 打印合并后的链表
        while (mergedList != null) {
            System.out.print(mergedList.val + " ");
            mergedList = mergedList.next;
        }
    }
}
方法二:递归
  1. 比较两个链表的当前节点,将较小的节点作为新链表的头节点。
  2. 递归地合并剩余的部分。
public class Solution {
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        // 递归终止条件
        if (l1 == null) return l2;
        if (l2 == null) return l1;

        // 递归合并
        if (l1.val < l2.val) {
            l1.next = mergeTwoLists(l1.next, l2);
            return l1;
        } else {
            l2.next = mergeTwoLists(l1, l2.next);
            return l2;
        }
    }

    // 定义 ListNode 类
    public static class ListNode {
        int val;
        ListNode next;
        ListNode(int val) { this.val = val; }
    }

    public static void main(String[] args) {
        Solution solution = new Solution();

        // 创建链表 1->2->4
        ListNode l1 = new ListNode(1);
        l1.next = new ListNode(2);
        l1.next.next = new ListNode(4);

        // 创建链表 1->3->4
        ListNode l2 = new ListNode(1);
        l2.next = new ListNode(3);
        l2.next.next = new ListNode(4);

        // 合并链表
        ListNode mergedList = solution.mergeTwoLists(l1, l2);

        // 打印合并后的链表
        while (mergedList != null) {
            System.out.print(mergedList.val + " ");
            mergedList = mergedList.next;
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值