21. 合并两个有序链表 --by 递归

public ListNode solution(ListNode l1, ListNode l2){
         if(l1 == null)return l2;
        if(l2 == null)return l1;

        ListNode res = new ListNode();
        ListNode result = res;
        while(l1 != null && l2 != null){
            if(l1.val < l2.val){
                res.next = l1;
                res = res.next;
                l1 = l1.next;
            }else{
                res.next = l2;
                res = res.next;
                l2 = l2.next;
            }
        }
        res.next = l1 == null ? l2 : l1;
        return result.next;
    }

思路比较简单,申请一个res节点,每次比较两个链表的节点值,将res的next域指向较小的那个节点,移动值较小的链表的指针,继续比较,同时res = res.next; 最后将剩下的一段链表接上就ok;


递归版本

  首先确定子问题,确定函数的结构,这里我们需要比较两个节点的大小,然后是链接较小值的节点,最后返回最小值即可,当然还需考虑两个边界情况。

public ListNode recursion(ListNode l1, ListNode l2){
        if(l1 == null)return l2;
        if(l2 == null)return l1;
        if(l1.val < l2.val){
            l1.next = recursion(l1.next,l2);
        }
        else{
            l2.next = recursion(l1,l2.next);
        }
        return l1.val < l2.val ? l1 : l2;
    }

 

  

  

posted @ 2021-07-27 17:22  fat鑫  阅读(60)  评论(0)    收藏  举报