Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >面试题: 合并两个有序链表

面试题: 合并两个有序链表

原创
作者头像
木子的昼夜
修改于 2021-04-06 03:04:59
修改于 2021-04-06 03:04:59
3530
举报
问题: 合并两个有序链表

链表L1: 1->2->4->9

链表L2: 3->5>6->10->13

合并后:1->2->3->4->5->6->9->10->13

01.png
01.png
1. 准备数据结构 及测试数据

Node节点

代码语言:txt
AI代码解释
复制
public class Node {
    public Integer value;
    public Node next;
    // 构造
    public Node(){}
    public Node(Integer value) {
        this.value = value;
    }
    public Node(Integer value,Node next) {
        this.value = value;
        this.next = next;
    }

    // 打印链表
    public void print() {
       Node n = this;
       System.out.println("------------------------------------------------");
       while (n != null) {
           System.out.print(n.value);
           n = n.next;
           if (n != null) {
               System.out.print("-->");
           } else {
               System.out.println();
           }
       }
       System.out.println("------------------------------------------------");
    }
}

准备测试数据

代码语言:txt
AI代码解释
复制
public class TestNode {
    public static void main(String[] args) {
        Node L1= getL1();
        Node L2= getL2();
        // 1-->2-->4-->9
        L1.print();
        // 3-->5-->6-->10-->13
        L2.print();
    }

    // 获取测试数据L1
    public static Node getL1() {
        Node head = new Node(1,new Node(2,new Node(4,new Node(9))));
        return head;
    }
    // 获取测试数据L2
    public static Node getL2() {
        Node head = new Node(3,new Node(5,new Node(6,new Node(10,new Node(13)))));
        return head;
    }
}
2.解决方案01

定义一个伪头节点Head 然后遍历L1 L2 比较Node值 小的就追加到Head后边

代码语言:txt
AI代码解释
复制
private static Node mergeNodes(Node l1, Node l2) {
        if (l1 == null ){
            return l2;
        }
        if (l2 == null) {
            return l1;
        }
        // 链表头
        Node head ;
        // 新链表添加的当前位置
        Node next ;
        // 先选出一个2个链表开头的最小值
        head = next = l1.value > l2.value ? l2:l1;
        // 头指针向后移动
        l1 = head == l1 ? l1.next : l1;
        l2 = head == l2 ? l2.next : l2;

        // 遍遍历2个链表
        while (l1 !=null && l2 != null) {
            // 遍历链表的最大值
            Node maxNode = null;
            // 链表1值大
            if(l1.value <= l2.value) {
                maxNode = l1;
                l1 = l1.next;
            } else {
                // 链表2值大
                maxNode = l2;
                l2 = l2.next;
            }
            // 添加到新链表 next向后移
            next.next = maxNode;
            next = next.next;
        }

        // 判断哪个链表还没有遍历完 直接加到新链表末尾
        next.next = l1 == null ? l2 :l1;
        // 返回head
        return head;
    }
3.解决方案02

定义一个伪头节点Head 然后遍历L1 L2 比较Node值 小的就追加到Head后边

使用递归 不用while循环

代码语言:txt
AI代码解释
复制
private static Node mergeNodesRec(Node l1, Node l2) {
        // 如果l1 链表已经遍历完了
        if (l1 == null) {
            return l2;
        }
        // 如果l2 链表已经遍历完了
        if (l2 == null) {
            return l1;
        }

        Node head ;

        if(l1.value <= l2.value) {
            head = l1;
            l1 = l1.next;
        } else {
            head = l2;
            l2 = l2.next;
        }
        // 递归调用 设置next
        head.next = mergeNodesRec(l1,l2);
        return head;
    }

自己写一写、用笔画一画 可能会豁然开朗 肯定还有其他写法 欢迎留言

欢迎关注公众号:

公众号二维码.jpg
公众号二维码.jpg

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
LeetCode - 合并两个有序链表
原题地址:https://leetcode-cn.com/problems/merge-two-sorted-lists/
晓痴
2019/08/16
3910
LeetCode - 合并两个有序链表
LeetCode97|合并两个有序链表
这道题理解起来还是比较容易的对吧,两两比较,然后将较小的数据挂载dummyNode节点后面,这就是使用哨兵节点的好处,一般链表都或多或少的增加一个哨兵节点来处理数据。
码农王同学
2020/10/14
3160
LeetCode-21 合并两个有序链表
今天我们学习第21题合并两个有序链表,这是一道简单题。下面我们看看这道题的题目描述。
用户3470542
2019/06/26
3880
LeetCode-21 合并两个有序链表
《剑指offer》第21天:合并两个有序链表
首先我们拿到题目乍眼一看,类似这种链表的合并问题。基本上马上可以想到需要设置一个哨兵节点,这可以在最后让我们比较容易地返回合并后的链表。(不懂哨兵节点的同学,可以先移驾到 06.删除链表倒数第N个节点(19) 进行学习)
程序员小浩
2020/09/04
2450
leecode刷题(23)-- 合并两个有序链表
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
希希里之海
2019/05/14
4120
LeetCode-21-合并两个有序链表
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
benym
2022/07/14
1570
21. 合并两个有序链表
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
张伦聪zhangluncong
2022/10/26
1730
​LeetCode刷题实战21:合并两个有序链表
算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !
程序员小猿
2021/01/19
2620
剑指Offer LeetCode 面试题24. 反转链表
面试题24. 反转链表 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
手撕代码八百里
2020/07/28
2820
LeetCode-面试题25-合并两个排序的链表
首先判断两个链表的值,小的头部赋值给MergeHead,然后进行下一步的递归判断,在合并的过程中可能出现链表长短不一的情况,如果l2链表为空返回l1剩下的头部,如果l1链表为空,返回l2剩下的头部
benym
2022/07/14
1530
面试官系列 - LeetCode链表知识点&题型总结
前段时间,写了面试必备的一系列文章,反应还不错。有一些读者反馈说,能不能整理一些面试常见的算法。前段时间,我恰好总结了 LeetCode 常见的面试算法题目。今天给大家分享一下。
程序员徐公
2022/01/20
6920
面试官系列 - LeetCode链表知识点&题型总结
leetcode链表之合并两个排序的链表
合并两个有序链表的基本思路就是设置一个cursor以及新链表的头指针,然后同时遍历两个链表,取小的节点作为cursor的next,然后该链表往前进,cursor也跟着往前进,最后再将cursor.next指向尚未遍历完的链表的剩余节点
code4it
2020/09/09
6640
leetcode链表之合并两个排序的链表
21 合并两个有序链表
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
木瓜煲鸡脚
2021/01/18
3070
21 合并两个有序链表
LeetCode 21:合并两个有序链表 Merge Two Sorted Lists
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
爱写bug
2019/07/25
4170
LeetCode题解—两个有序链表合并
关于空间复杂度,有可能有的朋友会觉得用到了m+n长度的链表?所以空间复杂度也是O(m+n)?
码上积木
2021/02/08
2.2K0
LeetCode题解—两个有序链表合并
【日拱一卒】链表——两个有序的链表合并
思路就是挨个比较两个链表中的元素,谁更小就先取谁,然后记得将指针移到下一个节点,直到遍历完两个链表。
JackieZheng
2020/08/11
4530
【日拱一卒】链表——两个有序的链表合并
画解算法:21. 合并两个有序链表
https://leetcode-cn.com/problems/merge-two-sorted-lists/
灵魂画师牧码
2019/06/27
5680
画解算法:21. 合并两个有序链表
搞定大厂算法面试之leetcode精讲15.链表
搞定大厂算法面试之leetcode精讲15.链表 视频讲解(高效学习):点击学习 目录: 1.开篇介绍 2.时间空间复杂度 3.动态规划 4.贪心 5.二分查找 6.深度优先&广度优先 7.双指针 8.滑动窗口 9.位运算 10.递归&分治 11剪枝&回溯 12.堆 13.单调栈 14.排序算法 15.链表 16.set&map 17.栈 18.队列 19.数组 20.字符串 21.树 22.字典树 23.并查集 24.其他类型题 链表操作如下图: 动画过大,点击查看 时间复杂度: prepend: O(1
全栈潇晨
2021/12/02
4450
LeetCode 21. 合并两个有序链表
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
freesan44
2020/06/08
2390
[剑指Offer]面试题25: 合并两个排序的链表
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足递增有序的规则。
宇宙之一粟
2020/10/26
2270
相关推荐
LeetCode - 合并两个有序链表
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档