Leetcode 21 合并两个有序链表 (链表)

本文介绍了两种在LeetCode中解决合并两个有序链表问题的Java代码实现,分析了解法1的时间复杂度为O(n+m),空间复杂度为O(1),并给出了优化后的解法2,其逻辑更简洁,只根据元素大小关系进行链表节点的添加。
摘要由CSDN通过智能技术生成

在这里插入图片描述

注意注意:先添加元素toadd.next = list1,添加之后才可以移动指针toadd = toadd.next

解法1 复杂的第一版本(优化大于和等于合并见方法二)

在这里插入图片描述
程序的时间复杂度是O(n + m),其中n和m分别是两个输入链表的长度。这是因为程序需要遍历两个链表中的所有节点,直到其中一个链表遍历完为止。
🔴空间复杂度是O(1),因为程序只使用了常数级别的额外空间来存储新的链表节点和辅助指针。没有使用额外的数据结构或递归调用,所以空间复杂度是常数级别的。


/**
 * Definition for singly-linked list.
 * 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; }
 * }
 */
class Solution {
    public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
        ListNode newlist = new ListNode(0); // 初始化一个链表节点,头节点保持不变保证后续返回
        ListNode toadd = newlist; //用作添加的节点,要不断后移

        while(list1 != null && list2 != null){
            if(list1.val == list2.val){
                toadd.next = list1;
                toadd = toadd.next;
                toadd.next = list2;
                toadd = toadd.next;

                list1 = list1.next;
                list2 = list2.next;

            } 
            else if(list1.val < list2.val) {
                toadd.next = list1;
                toadd = toadd.next;
                list1 = list1.next;
            } 
            else {
                toadd.next = list2;
                toadd = toadd.next;
                list2 = list2.next;
            }
        }
        if(list1 != null){
            toadd.next = list1;
        }
        if(list2 != null){
            toadd.next = list2;
        }
        return newlist.next;

    }
}
           
    

解法2

在这里插入图片描述

/**
 * Definition for singly-linked list.
 * 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; }
 * }
 */
class Solution {
    public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
        ListNode newlist = new ListNode(0); // 初始化一个链表节点,头节点保持不变保证后续返回
        ListNode toadd = newlist; //用作添加的节点,要不断后移

        while(list1 != null && list2 != null){
            if(list1.val <= list2.val){  //当list1 的元素小于等于 list2,添加list1元素,list1右移
                toadd.next = list1;
                list1 = list1.next;
            } 
            else {   //当list2 的元素小于 list2,添加list2元素,list2右移
                toadd.next = list2;
                list2 = list2.next;
            }
            toadd = toadd.next; // 执行操作后toadd指向下一个
        }

        if(list1 != null){
            toadd.next = list1;
        }
        if(list2 != null){
            toadd.next = list2;
        }

        return newlist.next;

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值