将两个递增有序的带头结点的单链表A、B合并成为一个递增有序的带头结点的单链表

一、题目

将两个递增有序的带头结点的单链表A、B合并成为一个递增有序的带头结点的单链表。

二、思路

将单链表A、B遍历,比较两个链表中元素的值,分为下列情况:

  • A < B,则A的指针向后移一位,然后再与B比较;

  • A=B,则A、B的指针同时向后移一位;

  • A>B,则B的指针向后移一位,然后再与A比较;

注意
  • 若A遍历完,B未遍历完,就将B的剩余部分接到新链表的尾部;

  • 若B遍历完,A未遍历完,就将A的剩余部分接到新链表的尾部;

三、输入输出样例:

输入:

A={1 3 5 7 9 }
B={2 4 6 8 10}

输出:

C={1 2 3 4 5 6 7 8 9 10 }

四、具体代码

public class SingleList {
    /*
     * 将单链表A、B合并成一个递增有序的新链表C
     */
    public void single_List(Node A,Node B,Node C){
         A=A.next;              //指针指向第一个元素
         B=B.next;              //指针指向第一个元素
        while(A!=null&&B!=null){//需要A、B链表同时不为空
            if(A.data<B.data){
                C.next=A;
                C=A;
                A=A.next;
            }
            else if(A.data==B.data){
                C.next=A;
                A=A.next;   //如果A、B的元素相等,则A、B的指针向后移位
                B=B.next;
            }
            else if(A.data>B.data){
                C.next=B;
                C=B;
                B=B.next;
            }   
        }
        if(A!=null){    //如果B遍历完了,A未遍历完,则将A的剩余部分接到C链表尾部
            C.next=A;
        }
        if(B!=null){    //如果A遍历完了,B未遍历完,则将B的剩余部分接到C链表尾部
            C.next=B;
        }
    }
}

五、总结

  • 当时判断A>B,A=B,A < B 三种情况时用了 if ….if….. if 这种结构,导致如果第一个if运行了,A=A.next之后很可能符合第二个if()语句,所以程序执行第二个if()语句,最终会导致指针乱指。所以必须换成 if….else if…..else if 这种语句;

  • 说一下if ….if….. if与if….else if…..else if 两者区别:

    • if ….if….. if是并行的语句结构,执行第一个if()之后,如果第二个if()符合,第二个if()语句也可以执行,同理,条件符合的话第三个if()语句也会执行;

    • if….else if…..else if 是三选一执行,倘若执行了第一个if()语句,之后的情况就算是符合第二个 else if()语句,也不会执行else if()语句;

  • 13
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值