这一句不太理解l1.next = mergeTwoLists(l1.next, l2);

要求

img


递归解法

class Solution {
    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;
        }
    }
}

l1.next = mergeTwoLists(l1.next, l2);

这一句代码是在使用递归来合并两个链表。


它将当前节点l1的next属性设置为递归调用mergeTwoLists(l1.next, l2)的返回值。这意味着它将当前节点l1的next属性设置为l1链表和l2链表中当前节点之后的部分组成的新链表。

具体来说,首先判断两个链表的第一个节点的值哪个小,如果第一个链表的第一个节点的值小,那么将第二个链表与第一个链表的第二个节点合并,并将第一个链表的第一个节点返回。

反之,将第一个链表与第二个链表的第二个节点合并,并将第二个链表的第一个节点返回。

这样,每次递归都会将两个链表的第一个节点中较小的节点插入到新链表中,最终得到一个有序的新链表。

举个例子:

假设第一个链表为 1 -> 2 -> 4
第二个链表为 1 -> 3 -> 4
第一次比较,第一个链表的第一个节点的值为1,第二个链表的第一个节点的值为1,选择第一个链表的第一个节点,并将第二个链表与第一个链表的第二个节点合并。
第二次比较,第一个链表的第二个节点的值为2,第二个链表的第一个节点的值为3,选择第二个链表的第一个节点,并将第一个链表与第二个链表的第二个节点合并。

接下来继续比较,每次选择较小的节点并将其与另一个链表的下一个节点合并,直到所有节点都被比较过。
最终得到的新链表为 1 -> 1 -> 2 -> 3 -> 4 -> 4。