merge-two-sorted-lists|Java 刷题打卡

207 阅读1分钟

本文正在参加「Java主题月 - Java 刷题打卡」,详情查看 活动链接

题目

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

示例 1:

img

输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]

示例 2:

输入:l1 = [], l2 = []
输出:[]

示例 3:

输入:l1 = [], l2 = [0]
输出:[0]

提示:

  • 两个链表的节点数目范围是 [0, 50]
  • -100 <= Node.val <= 100
  • l1l2 均按 非递减顺序 排列

知识点

  • 链表
  • 递归

我的回答

ListNode的数据结构

    public static class ListNode {
        public int val;
        public ListNode next;

        public ListNode() {
        }
        public ListNode(int val) {
            this.val = val;
        }
        public ListNode(int val, ListNode next) {
            this.val = val;
            this.next = next;
        }
    }

具体答案

链表相关的题目,一般来说都是有用递归来做。这题使用递归的话,能比较清晰的找到递归的终点,就是l1或者 l2为空。然后根据链表节点的大小重新构造链表。

public static ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        if (l1 == null) {
            return l2;
        } else if (l2 == null) {
            return l1;
        } else if (l1.val < l2.val) {
            printIndent(count++);
            System.out.println("l1 =" + l1.val + " l2=" + l2.val);
            l1.next = mergeTwoLists(l1.next, l2);
            printIndent(count--);
            System.out.println("l1 =" + l1.val + " l2=" + l2.val);
            return l1;
        } else {
            printIndent(count++);
            System.out.println("l1 =" + l1.val + " l2=" + l2.val);
            l2.next = mergeTwoLists(l1, l2.next);
            printIndent(count--);
            System.out.println("l1 =" + l1.val + " l2=" + l2.val);
            return l2;
        }
    }

递归题目都加上这个方法,能够打印出来递归树,更加方便的进行解题与调试。

    /**
     * printIndent 打印递归树用的
     *
     * @param n 层数
     * @date 20:31 2021/3/9
     */
    static void printIndent(int n) {
        for (int i = 0; i < n; i++) {
            System.out.print("   ");
        }
    }
    public static void main(String[] args) throws ParseException {
        ListNode l1 = new ListNode(1);
        ListNode l2 = new ListNode(2);
        l1.next = new ListNode(3);
        l1.next.next = new ListNode(5);
        l1.next.next.next = new ListNode(6);
        l1.next.next.next.next = new ListNode(7);
        l1.next.next.next.next.next = new ListNode(8);
        l1.next.next.next.next.next.next = new ListNode(9);
        l2.next = new ListNode(6);
        l2.next.next = new ListNode(9);
        mergeTwoLists(l1, l2);
        }

总结

没啥总结的啊,这题可以人脑压栈+控制台打印。