两个有序单链表合并成一个有序单链表--java版本

这篇博客介绍了如何使用Java将两个有序单链表合并为一个有序链表,提供了两种方法,一种需要创建新链表,另一种则不需要。详细阐述了每种方法的实现步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

该篇中链表的创建等操作看上一篇点这里

方法一:需创建新的链表
      1.创建一个新的头结点
      
      2.遍历两个链表,p代表head1的头结点,q代表head2的头结点
      
      3.如果p的下一个节点的值<q的下一个节点的值,就在head1链表中删除p节点,并将
      该节点插入到新链表中,新链表的指针后移(该程序中为h),否则的话就q节点执行上
      述操作.
      
      4. 任何一个链表遍历结束,循环停止,检查两个链表中是否还有剩下的节点,如果有
      的话,肯定是比新链表中的所有值都大的,直接插入到新链表的末尾.
//    方法一:创建新链表
    public static LinkedList hebing(LinkedList head1, LinkedList head2) {
    // 获取俩个链表的头结点
        HeroNode p = head1.getHead();
        HeroNode q = head2.getHead();
     //  创建一个新的链表
        LinkedList head3 = new LinkedList();
        HeroNode h = head3.getHead(); //头节点
       // 遍历两个链表,总是选择小的插入到新链表中
        while (p.next != null && q.next != null) {
            if (p.next.no < q.next.no) {
                h.next = p.next;
                p.next = p.next.next;
            } else {
                h.next = q.next;
                q.next = q.next.next;
            }
            h = h.next;
        }
        // 检查未遍历完的链表,有剩下的直接除头结点总体插入到新链表后边
      if (p.next != null)
        {
            h.next = p.next;
            p.next = null;
        }
        else
        {
            h.next = q.next;
            q.next = null;
        }
        return head3;
    }
方法二:不创建新链表
 1.遍历两个链表,p代表head1的头结点,q代表head2的头结点
 2.如果p的下一个节点的值<q的下一个节点的值,就在h1链表中删除p节点,并将该节点插入
 到被插入链表中,被插入链表的两个指针后移(当前节点和当前节点的下一个节点).
 3. 如果大于被插入链表的当前节点,原链表的指针一直后移,直到遇到比自己大的节点,或
 者链表结束了,才停止遍历.
 4. 如果原链表中有剩余节点,插入到被插入链表中.
      
   
  //   方法二:在原链表上操作
    public static LinkedList hebing1(LinkedList h1, LinkedList h2) {
    // 获取两个链表的头结点
        HeroNode p = h1.getHead();
        HeroNode q = h2.getHead();
     // 该指针用来记录被插入的链表的当前节点的后一个节点.
        HeroNode l = q.next;
       while(p.next!=null && q.next!=null){
       // 小于被插入链表的当前节点时,该节点在原链表中删除,插入的被插入链表中,同时,被插入链表的指针后移.
           if(p.next.no < q.next.no){
               q.next = p.next;
               p.next = p.next.next;
               q.next.next = l;
           }
           // 如果大于被插入链表的当前节点,原链表的指针一直后移,直到遇到比自己大的节点,或者链表结束了,才停止遍历.
               q = q.next;
               l = q.next;
           }

       if(p.next != null){
          q.next = p.next;
          h1.getHead().next = null;
       }
        return h2;
    }
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值