【数据结构】实现:合并两个升序的单链表,合并之后的链表后依旧有序

最近学习数据结构的算法的过程中,遇到了一个题,然后视频讲解的老师并没有给出答案(可能是我没找到),于是我就自己动手实现了一波。如有问题,请大家支点

核心思路

  • 校验两个链表的长度,如果都为null,直接返回
  • 如果链表1或者链表2中有一个链表的节点的next==null
    • 如果链表1节点的next为null,则之间将链表2的节点加入到返回结果的链表中
    • 如果链表2节点的next为null,则之间将链表1的节点加入到返回结果的链表中
  • 如果链表1的节点的next和链表2节点的next都不是null
    • 对比两个节点的值,寻找到小的节点,放入到返回结果的链表中,继续遍历
  • 当链表1和链表2的next节点都为null时,则停止遍历

核心代码在最下面,注释很全,相信大家看注释就可以明白!!!!!

链表类


/**
 * 定义SingleLinkedList,管理我们的英雄
 */
class SingleLinkedList{
   
    //初始化一个头节点,头节点不要动,不存放具体的数据
    private HeroNode head = new HeroNode(0,"","");


    public HeroNode getHead() {
   
        return head;
    }


    /**
     * 添加节点到单链表
     * 思路:当不考虑编号顺序
     * 1.找到当前链接的最后节点
     * 2.将最后这个节点的next指向新的节点
     * @param heroNode
     */
    public void add(HeroNode heroNode){
   
        //因为head节点不能动,因此我们需要一个复制遍历temp
        HeroNode temp = this.head;

        //遍历链表,找到最后
        while (true){
   
            //找到链表的最后
            if(temp.next == null){
   
                break;
            }
            //如果没有找到,就将temp后移动
            temp = temp.next;
        }
        //当退出while循环时,temp就指向链表的最后
        temp.next = heroNode;
    }


    /**
     * 变量单链表
     */
    public void show(){
   
        //判断链表是否为null
        if(head.next == null){
   
            System.out.println("链表为null");
            return;
        }
        //因为头节点不能动,因为我们需要一个辅助遍历来遍历
        HeroNode temp = head;
        while ((temp = temp.next) != null){
   
            System.out.println(temp);
        }
    }


    /**
     * 按照顺序将节点添加到单链表中
     * 第二种方式在添加英雄时,根据排名将英雄插入到指定位置
     * (如果有这个排名,则添加失败,并给出提示)
     * @param heroNode
     */
    public void addByOrder(HeroNode heroNode){
   

        //1.定义一个变量,存放头节点,因为头节点不能动,因为我们仍然通过一个辅助指针(变量)来帮助找到添加的位置
        //因为单链表,因我我们找的temp是位于添加位置的前一个节点,否则插入不了
        HeroNode temp = this.head;
        //定义flag作为是否重复的标志
        boolean flag = false;
        while (true){
   
            //说明已经遍历到节点末尾,或者是空链表
            if(temp.next == null){
   
                break;
            }
            //位置找到,就在temp的后面插入
            if(temp.next.no > heroNode.no)
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值