输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。例如输入下图中的链表1和链表2,则合并之后的升序链表如链表3所示:
链表的合并同链表的反转一样是经典的链表操作问题。
这这个问题中我们注意的点有:
- 有一个链表是空的,则合并后的链表就是另外一个链表;
- 两个链表都是空的,程序停止运行,报错;
- 每次选择在两个数中选择更小的数进行插入新链表中是一个归并操作,使用递归。
private static LinkNode Merge(LinkNode head1,LinkNode head2){
if(head1==null&&head2==null){
return null;//都为空,直接返回null
}
if(head1==null){
return head2;//链表1为空,合并后就是链表2
}
if(head2==null){
return head1;//链表2为空,合并后就是链表1
}
//每一次调用就是一次选“头部”的过程
LinkNode mergeHeadNode = null;//合并后的头结点
if(head1.getIdata()<head2.getIdata()){
//链表1最小的数小于链表2最小的数
mergeHeadNode = head1;//链表1的头部作为新链表的“头部”
mergeHeadNode.setNext(Merge(head1.getNext(), head2));//在链表1后面的结点中和链表2中选择“头部”
}else{
mergeHeadNode = head2;
mergeHeadNode.setNext(Merge(head2.getNext(), head1));
}
return mergeHeadNode;
}
测试代码:
public static void main(String[] args) {
SingleLinkList list1 = new SingleLinkList();
list1.insertHead(7);
list1.insertHead(5);
list1.insertHead(3);
list1.insertHead(1);
System.out.println("list1:");
list1.displayList();
SingleLinkList list2 = new SingleLinkList();
list2.insertHead(8);
list2.insertHead(6);
list2.insertHead(4);
list2.insertHead(2);
System.out.println("list2:");
list2.displayList();
//合并
SingleLinkList list3 = new SingleLinkList();
list3.setHead(Merge(list1.getHead(), list2.getHead()));
System.out.println("list3:");
list3.displayList();
SingleLinkList list = new SingleLinkList();
list.insertHead(8);
list.insertHead(6);
list.insertHead(4);
list.insertHead(2);
SingleLinkList list4 = new SingleLinkList();
list4.setHead(Merge(null, list.getHead()));
System.out.println("list4:");
list4.displayList();
SingleLinkList list5 = new SingleLinkList();
list5.setHead(Merge(null, null));
System.out.println("list5:");
list5.displayList();
}