本文正在参加「Java主题月 - Java 刷题打卡」,详情查看 活动链接
题目
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 1:
输入: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 <= 100l1和l2均按 非递减顺序 排列
知识点
- 链表
- 递归
我的回答
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);
}
总结
没啥总结的啊,这题可以人脑压栈+控制台打印。