Leetcode 21. 合并两个有序链表

题目

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

在这里插入图片描述
思路:把链表2的元素插入到链表1。通过比较val的值来插入。

public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        // 分别为两个链表创建头节点,变成新链表
        ListNode list1 = new ListNode(0,l1);
        ListNode list2 = new ListNode(0,l2);
        // 我选择链表2 插到 链表1
        // 有可能链表2的元素会小于链表1的第一个,所以temp1这个节点从头节点开始
        // temp2从原链表的第一个开始
        ListNode temp1 = list1;
        ListNode temp2 = list2.next;
        // 两者不为空 就一直遍历,
        // 由于temp1是要被插入的,如果直接用temp1!=null来判断会造成前面的节点丢失
        while(temp1.next != null&& temp2!=null){
            // 如果temp1下一个节点的val值大于等于temp2的当前节点val值,我们就认为我们找到了要插入的位置
            // 好比 把2插入到1,3,如果是判断temp1.val>=temp2.val。那插入的时候就无法进行了。
            // 3大于2 由于是单链表,所以我们无法获取到1让1指向2。如果用temp1.next.val就能避免这个问题
            if(temp1.next.val >= temp2.val){
                // 节点的插入 要用中间变量存储
                // 同时由于temp2被取走了 所以我们用变量存储temp2的next,否则找不到了
                ListNode temp3 = temp1.next;
                ListNode temp4 = temp2.next;
                temp1.next = temp2;
                temp2.next = temp3;
                temp2 = temp4;
            }else {//如果temp1.next是小于temp.val我们让temp1接着往下走就行
                temp1 = temp1.next;
            }
        }
        // 如果temp2不为空,说明temp2剩下的元素都比temp1的最大元素还大
        // 这里其实还有其余两种情况,分别是 temp1空,temp2空以及temp2空,temp1不空
        // 但是这两种情况都说明已经插入完毕了。因为temp2已经为空了。
        if(temp2!=null){
            temp1.next = temp2;
        }
        // 最后去掉头节点
        ListNode result = list1.next;
        return  result;
    }

在这里插入图片描述

因为两个链表都只遍历一次,所以时间复杂度为O(n);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值