剑指Offer——题25(合并两个排序的链表)

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);
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值