【详细整理】21. 合并两个有序链表(双指针+递归)

651 阅读1分钟

题目

leetcode-cn.com/problems/me…

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

思路

这题感觉思路很简单,没有对空间复杂度有要求,那就是新建一个链表C,双指针指向AB头结点,然后比较大小,小的放进去然后移动指针。注意点:

1、dummyhead

2、边界

3、C 在放入值之后它的指针也要移动

代码

    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        if(l1 == null){
            return l2;
        }
        if (l2 == null){
            return l1;
        }
        ListNode L3 = new ListNode(0);
        ListNode l3 = L3;
        ListNode A = l1;
        ListNode B = l2;
        while(A != null && B != null){
            if(A.val <= B.val){
                l3.next = A;
                A = A.next;
            }
            else{
                l3.next = B;
                B = B.next;
            }
            // 这里老是会忘l3要后移一位,谨记谨记,以后可以先把思路明确写出来在动手先,避免这种遗漏
            l3 = l3.next;
        }
        l3.next = A == null ? B : A;
        return L3.next;


    }
}

思路2——递归

递归就是明确这个节点要做什么,这个节点要做的就是:

比较大小,然后将小的值放入链表,小的指针后移一步。

然后明确一下递归入口参数和出口返回:

入口参数应该就是两个链表,出口返回就是新的链表。

出口返回这想错了,因为递归嘛,应该就是直接返回值小的那个

都明确了就开始写了,不要想细节,细节交给递归。

其实真的开始写这个递归了,还是觉得有点云里雾里

重新来看一下就明白了。就是较小的值next指向剩余结果的递归结果(将函数功能带进去看,不看具体实现)

class Solution {
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        if(l1 == null){return l2;}
        if(l2 == null){return l1;}
        // mergeTwolists的功能就是合并升序链表
        // l1值小的时候,它的next指向了l1剩下部分和l2的升序结果
        // 返回l1
        if(l1.val <= l2.val){
            l1.next = mergeTwoLists(l1.next,l2);
            return l1;
        }else{
            l2.next = mergeTwoLists(l2.next,l1);
            return l2;
        }

    }
}