AC牛客 BM4 合并两个排序的链表

简介: AC牛客 BM4 合并两个排序的链表

BM4 合并两个排序的链表

题目描述

描述

描述

输入两个递增的链表,单个链表的长度为n,合并这两个链表并使新链表中的节点仍然是递增排序的。

数据范围:0≤n≤1000, 0≤节点值≤1000
要求:空间复杂度 O(1),时间复杂度 O(n)

如输入{1,3,5},{2,4,6}时,合并后的链表为{1,2,3,4,5,6},所以对应的输出为{1,2,3,4,5,6},转换过程如下图所示:

在这里插入图片描述

或输入{-1,2,4},{1,3,4}时,合并后的链表为{-1,1,2,3,4,4},所以对应的输出为{-1,1,2,3,4,4},转换过程如下图所示:

在这里插入图片描述

示例1

输入:

{1,3,5},{2,4,6}

返回值:

{1,2,3,4,5,6}

示例2

输入:

{},{}

返回值:

{}

示例3

输入:

{-1,2,4},{1,3,4}

返回值:

{-1,1,2,3,4,4}

解题思路

解法1 利用哑结点

1.使用哑结点,遍历list1、list2

2.如果list1.val < list2.val,则采用list1当前节点,并且移动到下一位,否则为list2的当前节点

3.直到list1或者list2为空,把剩余节点,遍历完成即为所求结果

4.此时哑结点的下一节点,即为所求结果

解法2 空间复杂度为O(1)的解法

使用哑结点的解法,时间复杂度和空间复杂度都是O(n),题目要求,空间复杂度需要为O(1)

1.想到了在list当前链表,直接操作的解法

2.直接比较当前节点值list1.val < list2.val,则继续遍历list1,否则将list2的当前节点,插入到list1当前节点中

3.重复步骤2,直到移动到list1或者list2末尾

在这里插入图片描述

实践代码

解法 1 代码

import java.awt.List;

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    public ListNode Merge(ListNode list1, ListNode list2) {
        ListNode node = new ListNode(1);
        ListNode res = node;
        while (list1 != null && list2 != null) {
            if (list1.val < list2.val) {
                node.next = new ListNode(list1.val);
                list1 = list1.next;
            } else {
                node.next = new ListNode(list2.val);
                list2 = list2.next;
            }
            node = node.next;
        }

        while (list1 != null) {
            node.next = new ListNode(list1.val);
            list1 = list1.next;
            node = node.next;
        }

        while (list2 != null) {
            node.next = new ListNode(list2.val);
            list2 = list2.next;
            node = node.next;
        }
        
        return res.next;
    }
}

解法2 代码

import java.awt.List;

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    public ListNode Merge(ListNode list1, ListNode list2) {
        if (list1 == null) {
            return list2;
        }

        if (list2 == null) {
            return list1;
        }
        return list1.val < list2.val ? mergetListNode(list1, list2) : mergetListNode(list2, list1);
    }

    private ListNode mergetListNode(ListNode list1, ListNode list2) {
        ListNode res = list1;
        ListNode pre = list1;
        list1 = list1.next;
        while (list1 != null && list2 != null) {
            if (list1.val < list2.val) {
                list1 = list1.next;
                pre = pre.next;
            } else {
                pre.next = new ListNode(list2.val);
                pre.next.next = list1;
                pre = pre.next;
                list2 = list2.next;
            }
        }

        if (list2 != null) {
            pre.next = list2;
        }
        return res;
    }
}
目录
相关文章
|
2月前
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
56 0
|
2月前
|
算法
❤️算法笔记❤️-(每日一刷-83、删除排序链表中的重复项)
❤️算法笔记❤️-(每日一刷-83、删除排序链表中的重复项)
34 0
|
4月前
|
存储 算法
LeetCode第83题删除排序链表中的重复元素
文章介绍了LeetCode第83题"删除排序链表中的重复元素"的解法,使用双指针技术在原链表上原地删除重复元素,提供了一种时间和空间效率都较高的解决方案。
LeetCode第83题删除排序链表中的重复元素
|
4月前
|
存储 算法 Java
LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
48 0
|
6月前
23.合并K个升序链表
23.合并K个升序链表
|
6月前
|
存储 SQL 算法
LeetCode 83题:删除排序链表中的重复元素【面试】
LeetCode 83题:删除排序链表中的重复元素【面试】
|
6月前
|
存储 SQL 算法
LeetCode 题目 82:删除排序链表中的重复元素 II
LeetCode 题目 82:删除排序链表中的重复元素 II
|
6月前
|
存储 算法 数据挖掘
Leetcode二十三题:合并K个升序链表【22/1000 python】
Leetcode二十三题:合并K个升序链表【22/1000 python】
|
7月前
【移除链表元素】LeetCode第203题讲解
【移除链表元素】LeetCode第203题讲解
|
6月前
|
存储 SQL 算法
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表