1.题目
输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。
2.思路
递归实现:合并过程中,每次都是从两个链表中找出较小的一个来链接,因此可以采用递归来实现:当任意一个链表为null时,直接链接另一个链表即可;其余情况只需要在两个链表中找出较小的一个结点进行链接,该结点的next值继续通过递归函数来链接
注意:
每当代码试图访问空指针指向的内存时,程序就会崩溃,从而导致鲁棒性问题,本题中一旦输入空的链表就会引入空的指针,因此我们要对空链表单独处理。
1.当第一个链表为空链表,就把它和第二个链表合并,显然结果是第二个链表
2.当第2个链表为空链表,就把它和第1个链表合并,显然结果是第1个链表
3.当两个链表都为空时,结果直接返回空
3.代码实现
public class Merge {
class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
public ListNode(int val, ListNode next) {
this.val = val;
this.next = next;
}
}
public ListNode Merge(ListNode list1, ListNode list2) {
if (list1 == null) {
return list2;
}
if (list2 == null) {
return list1;
}
ListNode mergeNode;
if (list1.val < list2.val) {
mergeNode = list1;
mergeNode.next=Merge(list1.next, list2);
} else {
mergeNode = list2;
mergeNode.next=Merge(list1, list2.next);
}
return mergeNode;
}
//正常功能测试
@Test
public void test1(){
ListNode listNode6=new ListNode(6,null);
ListNode listNode3=new ListNode(3,listNode6);
ListNode listNode1=new ListNode(1,listNode3);
ListNode listNode5=new ListNode(5,null);
ListNode listNode4=new ListNode(4,listNode5);
ListNode listNode2=new ListNode(2,listNode4);
ListNode pHead=Merge(listNode1,listNode2);
System.out.println(pHead);
}
//当一个链表为空
@Test
public void test2(){
ListNode listNode5=new ListNode(5,null);
ListNode listNode4=new ListNode(4,listNode5);
ListNode listNode2=new ListNode(2,listNode4);
ListNode pHead=Merge(null,listNode2);
System.out.println("合并后的数组为:");
while(pHead!=null){
System.out.println(pHead.val);
pHead=pHead.next;
}
}
//当2个链表为空
@Test
public void test3(){
ListNode pHead=Merge(null,null);
System.out.println(pHead);
}
}