LeetCode-21. Merge Two Sorted Lists(合并两个有序链表)(非递归和递归)

LeetCode-21. Merge Two Sorted Lists(合并两个有序链表)(非递归和递归)

  • 非递归
  • 递归

题目链接

非递归解法

非递归解法很简单,就是每次比较两个结点,把较小的加到结果链表中,并且那个指针向后移动,代码如下:

    /**
     * 方法一
     * O(min(N,M))
     * @param l1
     * @param l2
     * @return
     */
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        ListNode res = new ListNode(0);
        ListNode p = res;
        while (l1 != null && l2 != null) {
            if (l1.val <= l2.val) {
                p.next = l1;
                p = p.next;
                l1 = l1.next;
            } else {
                p.next = l2;
                p = p.next;
                l2 = l2.next;
            }
        }
        if (l1 != null) p.next = l1;
        if (l2 != null) p.next = l2;
        return res.next;
    }

递归解法

非递归的解法就是每次比较两个链表的头部,将较小的头部单独取出来,然后剩下的两个部分继续递归,和归并排序很类似,具体流程看下图 :
这里写图片描述

    /**
     * 递归实现
     * @param l1
     * @param l2
     * @return
     */
    public ListNode mergeTwoLists(ListNode l1,ListNode l2){
        if(l1 == null || l2 == null)return l1 == null ? l2 : l1;  //递归边界
        if(l1.val < l2.val){
            l1.next = mergeTwoLists(l1.next,l2);
            return l1;
        }else {
            l2.next = mergeTwoLists(l1,l2.next);
            return l2;
        }
    }

猜你喜欢

转载自blog.csdn.net/zxzxzx0119/article/details/81710111