leetcode21 Merge Two Sorted Lists

easy list 第三题

这个可以用递归写出来,不过递归可能不是太好理解。可以尝试这样理解:

1,边界,也就是递归的递的最后一层是什么,这个需要返回,如果不返回 就是一直在递归,除了浪费内存没有什么意义。 在这个题里面其实很好找,就是list1 或/并 list2为空的时候,如果list1 或/并 为空的时候,我们也不需要遍历或者递归了,直接返回就行了,list1递归完了 返回list2, list2递归结束返回list1, 因为另一方可能还有值,但是这些值不需要关心了,直接返回就可以了,就是归就可以了。

2,条件

什么条件呢,肯定是list1.val和list2.val对比嘛。如果list1.val <= list2.val,我们需要调用mergeTwoList(list1.next, list2)。因为这两个是排序好的链表,我们这样理解,假定list1的next也就是list1的第二个节点和list2排序完成了,我们最后一步需要做什么,需要把list1的next指针指已经排序好的mergeTwoList(list1.next, list2)的返回结果,然后返回list1。这样应该好理解一些。

有了这两个理解这个题如果使用递归就好写咯:

    public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
        if(list1 == null){
            return list2;
        }else if(list2 == null){
            return list1;
        }else if(list1.val <= list2.val){
            list1.next = mergeTwoLists(list1.next, list2);
            return list1;
        }else{
            list2.next = mergeTwoLists(list1, list2.next);
            return list2;
        }
    }

还有一个方法是建立虚拟的头节点,这个很好理解,就是建立一个虚拟头节点,然后对比list1 list2的结点,按照从小到大接到虚拟头结点后面,最后返回虚拟头结点的next。这个比较直观就不写了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值