2022年4月6日。现在的评定仍然为中级小白。
题目描述
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 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 <= 100
l1 和 l2 均按 非递减顺序 排列
这道题给我的启发就是做一道题,首先要明白题目问的什么。因为我现在的水平还没快到想之前的一些基础知识能够瞬间反应出来题中的val和next是什么。我看到题的时候只想知道这俩玩意代表什么,虽然也有自己的猜测,但是我总以为题目中说的两个升序链表就是参数列表里的ListNode,虽然我知道这玩意翻译过来叫节点。然后为了让我的想法变成正确的,我就查了些资料,以及正确答案,我终于明白过来了,传递的参数仅仅是两个升序链表的第一个节点而已,并不是整个的升序链表。里面的val是指这个链表节点中的值,而next就是类似于指针的东西,指向下一个值存放的地址,当然这个地址中也是一个节点。那么,题目搞明白了,就可以开始做题了。
思路:
首先要明白,链表之间是靠指针来链接的,所以要人为对比val的值,然后排序,然后按排序的顺序将每个节点指向排序过后相邻的节点,这样才能达到节点排序的目的。
那么参数列表中的两个节点就是作为两个升序链表的头节点存在的,所以我们只需要判断出两个节点中的值谁大谁小,然后将val值小的那个节点的指向,指到相对大的那个节点和小的节点的下一个节点中间那个比较小的那个节点就可以,话有点绕,简单画个图;
A和C就是参数列表中的两个头节点,比较A和C中的val值,假定A>C ,那么只需要比较B和C中的val值,找出两个中val值小的那个,然后让A的指向,指向最小的那个就行,假定C比较小,那么这个指向就会变成:
这样的话,按照这样的规则,下一次就比较B和D里面谁小,让C指向更小的那个就可以了,如此循环,知道两个升序链表的所有节点都指向完毕。代码如下,实际上就是使用了递归的想法:
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
if(list1 == null){return list2;}
if(list2 == null){return list1;}
ListNode minNode = list1.val < list2.val ? list1 : list2;
ListNode maxNode = list1.val >= list2.val ? list1 : list2;
minNode.next = mergeTwoLists(minNode.next,maxNode);
return minNode;
}
在自己的方法体中不断的调用自己,达到排序的目的。这样就完美解决了这个问题。
这个题,嗯,有点小东西,不过东西不大,还是要很努力的学习记忆的。加油,继续加油!!!