easy list 第三题
这个可以用递归写出来,不过递归可能不是太好理解。可以尝试这样理解:
1,边界,也就是递归的递的最后一层是什么,这个需要返回,如果不返回 就是一直在递归,除了浪费内存没有什么意义。 在这个题里面其实很好找,就是list1 或/并 list2为空的时候,如果list1 或/并 为空的时候,我们也不需要遍历或者递归了,直接返回就行了,list1递归完了 返回list2, list2递归结束返回list1, 因为另一方可能还有值,但是这些值不需要关心了,直接返回就可以了,就是归就可以了。
2,条件
什么条件呢,肯定是list1.val和list2.val对比嘛。如果list1.val <= list2.val,我们需要调用mergeTwoList(list1.next, list2)。因为这两个是排序好的链表,我们这样理解,假定list1的next也就是list1的第二个节点和list2排序完成了,我们最后一步需要做什么,需要把list1的next指针指已经排序好的mergeTwoList(list1.next, list2)的返回结果,然后返回list1。这样应该好理解一些。
有了这两个理解这个题如果使用递归就好写咯:
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
if(list1 == null){
return list2;
}else if(list2 == null){
return list1;
}else if(list1.val <= list2.val){
list1.next = mergeTwoLists(list1.next, list2);
return list1;
}else{
list2.next = mergeTwoLists(list1, list2.next);
return list2;
}
}
还有一个方法是建立虚拟的头节点,这个很好理解,就是建立一个虚拟头节点,然后对比list1 list2的结点,按照从小到大接到虚拟头结点后面,最后返回虚拟头结点的next。这个比较直观就不写了。