2025年- H32-Lc140 --21. 合并两个有序链表--Java版

1.题目描述

在这里插入图片描述

2.思路

(1)定义一个虚拟的头节点,然后pre指针刚开始赋值要等于这个虚拟头节点
(2)比较l1和l2值得大小,如果l1小,就把指针指向l1(pre.next=l1),同时list指针要向后移list1=list1.next;如果l2小,就把指针指向l2(pre.next=l2);
(3) 指针后移pre=pre.next;
(4)如果链表的大小不一样。比如l1null,说明l2还有元素,把此时的pre指针指向l2,比如pre.next=l2。比如l2null,说明l1还有元素,把此时的pre指针指向l1,比如pre.next=l1。

3.代码实现

class ListNode{
    int val;
    ListNode next;

    public ListNode() {
    }

    public ListNode(int val) {
        this.val = val;
    }

    public ListNode(int val, ListNode next) {
        this.val = val;
        this.next = next;
    }
}
public class H21 {

    public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
        //1.创建一个虚拟头节点,虚拟头节点这边可以是任意值
        ListNode dummyhead=new ListNode(-1);
        //2.设置一个pre指针,刚开始从在虚拟头节点上
        ListNode pre=dummyhead;

        //3.因为是两个有序链表合并,最后组合成一个有序链表
        //循环终止条件是list1=null和list2=null就停止变量
        while(list1!=null&&list2!=null)
        {
            //4.开始比较两个链表的值
            if(list1.val<=list2.val)
            {
                pre.next=list1;//因为list1的值比较小,所以pre的next指针直接指向list1
                list1=list1.next;//继续移动list1的指针
            }
            else
            {
                pre.next=list2;
                list2=list2.next;//继续移动list2的指针
            }
            //5.比较完list1和list2的大小之后,pre指针要继续后移(在新组成整个链上移动)。
             pre=pre.next;
        }

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

        if(list1==null)//l1为空,但是l2还有值
        {
            pre.next=list2;//将此时l1尾部pre指针指向list2的剩余节点
        }
        else{
            pre.next=list1;
        }
        return dummyhead.next;

    }
    public static void main(String[] args)
    {
    H21 test=new H21();
    //创建第一个链表并且赋值
    ListNode node3=new ListNode(4,null);
    ListNode node2=new ListNode(2,node3);
    ListNode head=new ListNode(1,node2);
    //创建第二个链表并且赋值
    ListNode node3_l2=new ListNode(3,null);
    ListNode node2_l2=new ListNode(2,node3_l2);
    ListNode head_l2=new ListNode(1,node2_l2);
    ListNode res=test.mergeTwoLists(head,head_l2);
    System.out.print("输出合并两个有序链表的结果:");
    while(res!=null)
    {
        System.out.print(res.val);
        if(res.next!=null)
        {
            System.out.print("->");
        }
        //res要继续往后移
        res=res.next;
    }
    }


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值