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