算法刷题之路之链表初探(二)Leecode21合并两个有序链表

算法刷题之路之链表初探(二)

今天来学习的算法题是leecode141环形链表,是一道简单的入门题,话不多说!直接上!

条件(Leecode21)

在这里插入图片描述

重点!!!

我直接把解释写代码上啦!先上文字详解!!

ListNode prehead = new ListNode(-1);

创建一个新的链表节点 prehead,值为 -1,作为合并后链表的头节点的前置节点。

ListNode prev = prehead;

创建一个指针 prev,初始化为 prehead,用来构建新链表。

while (l1 != null && l2 != null) {

进入循环,只要 l1 和 l2 都不为 null。

if (l1.val <= l2.val) {

比较 l1 和 l2 当前节点的值,如果 l1 的值小于等于 l2 的值,执行以下操作:

prev.next = l1; 将 prev 的 next 指向 l1,将 l1 加入新链表。 l1 = l1.next; 移动 l1
到下一个节点。 else {

如果 l2 的值小于 l1 的值,执行以下操作:

prev.next = l2; 将 prev 的 next 指向 l2,将 l2 加入新链表。 l2 = l2.next; 移动 l2
到下一个节点。 prev = prev.next;

将 prev 指向新链表的最后一个节点,即刚刚加入的节点。

循环继续,直到 l1 或 l2 中有一个为空。

prev.next = l1 == null ? l2 : l1;

循环结束后,将剩余的未合并完的链表直接接到新链表的末尾。

return prehead.next;

返回 prehead 的 next,即新链表的头节点。

这段代码的核心思想是利用一个 prev 指针构建新的链表,依次比较两个链表的节点值,将较小的节点加入新链表中,直到其中一个链表为空,然后将剩余链表直接连接到新链表的末尾。

代码

public class Leecode21 {
    public 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 static void main(String[] args) {

        }
}
class Solution {
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        // 创建一个头节点 prehead,并初始化为值为 -1
        ListNode prehead = new ListNode(-1);

        // 将 prev 指向 prehead,用于构建新链表
        ListNode prev = prehead;

        // 循环条件:当 l1 和 l2 都不为 null 时
        while (l1 != null && l2 != null) {
            // 比较 l1 和 l2 当前节点的值
            if (l1.val <= l2.val) {
                // 如果 l1 的值小于等于 l2 的值,将 prev 的 next 指向 l1,并将 l1 向后移动一位
                prev.next = l1;
                l1 = l1.next;
            } else {
                // 如果 l2 的值小于 l1 的值,将 prev 的 next 指向 l2,并将 l2 向后移动一位
                prev.next = l2;
                l2 = l2.next;
            }
            // 将 prev 指向新链表的最后一个节点
            prev = prev.next;
        }

        // 合并后 l1 和 l2 最多只有一个还未被合并完,我们直接将链表末尾指向未合并完的链表即可
        prev.next = l1 == null ? l2 : l1;

        // 返回合并后的链表,prehead.next 是新链表的头节点
        return prehead.next;
    }
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值