龙空技术网

《JAVA筑基100例》「第13题」合并两个有序链表(考察递归)

小虚竹分享技术 78

前言:

现时各位老铁们对“c语言合并两个有序链表”大约比较重视,姐妹们都想要学习一些“c语言合并两个有序链表”的相关知识。那么小编同时在网上收集了一些有关“c语言合并两个有序链表””的相关文章,希望小伙伴们能喜欢,你们快快来学习一下吧!

#头条创作挑战赛#

❤️作者简介:大家好,我是小虚竹。Java领域优质创作者,CSDN博客专家,华为云享专家,掘金年度人气作者,阿里云专家博主,51CTO专家博主

❤️技术活,该赏

❤️点赞 收藏 ⭐再看,养成习惯

零、前言

今天是学习 「JAVA语言」 打卡的第13天,我的学习策略很简单,题海策略+ 费曼学习法。如果能把这100题都认认真真的自己实现一遍,那意味着 「JAVA语言」 已经筑基成功了。后面的进阶学习,可以继续跟着我,一起走向架构师之路。

一、题目描述

原题地址--》传送门 题目: 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

二、解题思路如果把问题拆解成子问题,子问题具有跟父问题一样的结构,可以考虑用自上而下的递归对两个有序链接l1和l2进行非空判断,有空的话,返回另一个非空链接

三、代码详解

ListNode 链表对象

package com.xiaoxuzhu;/** * Description: 链表对象 * * @author zenghw * @version 1.0 * * <pre> * 修改记录: * 修改后版本         修改人  修改日期   修改内容 * 2022/8/21.1     zenghw  2022/8/21      Create * </pre> * @date 2022/8/21 */public class ListNode {    int val;    ListNode next;    public ListNode() {        super();    }    public ListNode(int val) {        this.val = val;        this.next = null;    }    public ListNode(int val, ListNode next) {        this.val = val;        this.next = next;    }}

Solution类

package com.xiaoxuzhu;/** * Description: 合并两个有序链表(考察递归) * * @author zenghw * @version 1.0 * * <pre> * 修改记录: * 修改后版本         修改人  修改日期   修改内容 * 2022/8/21.1     zenghw  2022/8/21      Create * </pre> * @date 2022/8/21 */class Solution {    public static void main(String[] args) {        //l1 = [1,2,4], l2 = [1,3,4]        //初始化数据        int[] l1 = new int[]{1,2,4};        int[] l2 = new int[]{1,3,4};        //创建首节点,节点的val是1.        ListNode listnode1 = new ListNode(1);        //创建首节点,节点的val是1.        ListNode listnode2 = new ListNode(1);            initListNode(listnode1,l1);        initListNode(listnode2,l2);        ListNode listnode3 =  mergeTwoLists(listnode1,listnode2);        print(listnode3);    }    private static void print(ListNode listnode){        //创建链表节点        while(listnode!=null){            System.out.println("节点:"+listnode.val);            listnode=listnode.next;        }    }    /**     * 创建链表     *     * @param listnode 链表对象     * @param arr 初始化数组数据     *@return void     **/    public static void initListNode(ListNode listnode,int[] arr){        //声明一个变量用来在移动过程中指向当前节点        ListNode nextNode;        //指向首节点,这样两个结点的指针指向同一个结点        nextNode=listnode;                              //创建链表        for (int i = 1; i < arr.length; i++) {            //把新节点连起来            nextNode.next= new ListNode(arr[i]);            //当前节点往后移动            nextNode=nextNode.next;                   }    }    /**     * 合并链表     *     * @param l1  要合并的链表1     * @param l2 要合并的链表2     *@return com.xiaoxuzhu.ListNode     **/    public static ListNode mergeTwoLists(ListNode l1, ListNode l2) {        if (l1 == null) {            return l2;        } else if (l2 == null) {            return l1;        } else if (l1.val < l2.val) {            l1.next = mergeTwoLists(l1.next, l2);            return l1;        } else {            l2.next = mergeTwoLists(l1, l2.next);            return l2;        }    }}

我是虚竹哥,我们下一题见~

标签: #c语言合并两个有序链表