题目描述

image.png

解题思路

创建新节点

  • 一个节点指向链表一,一个指向链表二,使用虚拟头节点在一个新链表上进行添加,根据 l1 和 l2 的大小判断进行添加。
  • 最后有其中一个链表到尾后,另一个链表此时就可以把剩余的节点全部加在链表三上。

    1. /**
    2. * 新创建节点
    3. *
    4. * @param l1
    5. * @param l2
    6. * @return
    7. */
    8. public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
    9. if (l1.next == null) {
    10. return l2;
    11. }
    12. if (l2.next == null) {
    13. return l1;
    14. }
    15. ListNode dummy = new ListNode(-1);
    16. ListNode cur = dummy;
    17. while (l1.next != null && l2.next != null) {
    18. if (l1.val > l2.val) {
    19. cur.next = l2;
    20. l2 = l2.next;
    21. } else {
    22. cur.next = l1;
    23. l1 = l1.next;
    24. }
    25. cur = cur.next;
    26. }
    27. if (l1.next == null) {
    28. cur.next = l2;
    29. } else {
    30. cur.next = l1;
    31. }
    32. return dummy.next;
    33. }

    递归法

    1、链表题,且有重复逻辑,一般都可以用递归。
    2、递归三部曲:

  • 终止条件中,l1或者l2为空时,返回另一边,是常规操作了。关键是两边都不为空时,返回谁的问题。

  • 返回值:在本层递归中,如果只是返回较小的节点,那么到最后的输出只有一个最后的节点。所以关键是怎么调用函数实现每次返回结果的连接,返回一个节点作为连接。
  • 本层实现的逻辑:分析题目要求,递增合并链表,所以每一层向上返回的应该不仅是较小的节点,且该节点的后边为合并好的链表。所以先递归调用函数,完成当前节点和next节点(为下次递归的返回值)的连接,然后再返回当前节点。
    1. /**
    2. * 递归法
    3. *
    4. * @param l1
    5. * @param l2
    6. * @return
    7. */
    8. public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
    9. if (l1 == null) {
    10. return l2;
    11. } else if (l2 == null) {
    12. return l1;
    13. } else {
    14. if (l1.val < l2.val) {
    15. l1.next = mergeTwoLists(l1.next, l2);
    16. return l1;
    17. } else {
    18. l2.next = mergeTwoLists(l1, l2.next);
    19. return l2;
    20. }
    21. }
    22. }