【每日一题-leetcode】 21. 合并两个有序链表

21. 合并两个有序链表

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

示例:

输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4

1.迭代

th:主要是通过定义一个head节点 遍历两个链表就可以,最后一定会有一个链表没有遍历完 使用三目运算符进行算

需要注意的点 因为head节点一直next next下去 所以应该定义一个root节点 作为根节点 head节点 一直next下去。返回的是root节点

time:O(m+n)

space:O(1)

  /*
        *思路 主要是通过定义一个head节点 遍历两个链表就可以,最后一定会有一个链表没有遍历完 使用三目运算符进行算
        notice 因为head节点一直next next下去 所以应该定义一个root节点 作为根节点 head节点 一直next下去。返回的是root节点
        */
        public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
            if(l1 == null || l2 == null){
                return null;
            }
    
            ListNode root = new ListNode(-1);
    
            ListNode head = root;
    
            while(l1!=null && l2!= null){
                if(l1.val <= l2.val){
                    head.next = l1;
                    l1 = l1.next; 
                }else{
                    head.next = l2;
                    l2 = l2.next;
                }
                head = head.next;
            }
    
            head.next = (l1 == null ? l2 : l1);
    
            return root.next;
        }

2.递归

th:其实如果一个方法可以迭代就可以递归解决,但是递归代码虽然简洁 理解上比较难一些,递归代码无非就是 三点需要注意:1 终止条件 2. 业务逻辑 3.解决下一个子问题 也就是 调用自身。

time:O(m+n)

space:调用 mergeTwoLists 退出时 l1 和 l2 中每个元素都一定已经被遍历过了,所以 n + mn+m 个栈帧会消耗 O(n + m)O(n+m) 的空间。

  public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
           if(l1 == null ){
               return l2;
           }else if(l2 ==  null){
               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;
           }
        }
原文地址:https://www.cnblogs.com/qxlxi/p/12860680.html