cuiter  

21、合并两个有序列表

题目描述:

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

示例 1:

img

输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]

示例 2:

输入:l1 = [], l2 = []
输出:[]

示例 3:

输入:l1 = [], l2 = [0]
输出:[0]

提示:

  • 两个链表的节点数目范围是 [0, 50]
  • -100 <= Node.val <= 100
  • l1l2 均按 非递减顺序 排列

解析过程:

1、将两个链表合成一个链表,有很多种方式,比如将链表的值取出来放入列表中,进行排序,再封装成链表,但效率太低了;又比如说循环迭代,效率比较高,代码也比较简单;可是也能用递归完成,何不练练手?

2、那么用递归的方式解决一下。

3、第一个问题,递归的终止条件是什么?由于两条链都是升序,很明显,当两条链其中一条链到递归到底了就可以终止递归了。

4、第二个问题,递归返回值是什么?可以结合第三个问题看一下,就知道递归应该返回值小的那条链。

5、第三个问题,本级递归(看第一级就可以了)该做什么?应该比较两条链头节点的大小,再将值小的链的下一个节点拿去和值大的比较。

6、到此递归三大问题就被解决了,即可赋上当代码。

附上代码:

    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {

        //递归法
        if (l1 == null) {//l1递归到底,那么返回l2,并终止递归
            return l2;
        }
        else if (l2 == null) {//l2递归到底,那么返回l1,并终止递归
            return l1;
        }
        else if (l1.val < l2.val) {//递归做什么?比较大小
            l1.next = mergeTwoLists(l1.next, l2);//将值小的链的下一个节点拿去和值大的比较
            return l1;//返回值小的那条链
        }
        else {//递归做什么?比较大小
            l2.next = mergeTwoLists(l1, l2.next);//将值小的链的下一个节点拿去和值大的比较
            return l2;//返回值小的那条链
        }
    }

总结:

递归解题三要素:找终止条件找返回值本级递归应该做什么

posted on 2021-03-31 13:27  jiaotong  阅读(120)  评论(0)    收藏  举报