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

2023-05-16

一、题目

将两个递增有序的带头结点的单链表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()语句;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐