题目
思路1:迭代
当我第一眼看到这道题时,心中第一个想到的便是迭代算法:新创建一个链表,建立两个移动指针,指针在L1和L2上滑动并比较。当发现小的值时,利用尾插法将其加入到新链表中。
优点:容易想到
缺点:创建新链表应该并不时出题人的意图,出题人的意图应该是想让我们在原链表上修改。
class Solution {
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
if(list1== null)
return list2;
if(list2 == null)
return list1;//上面两种情况直接返回
ListNode cur = new ListNode(-1);//创建一个新的节点
ListNode lr = cur;
ListNode l1 = list1;
ListNode l2 = list2;//标记指针
while(l1!=null&&l2!=null){
//接下来选出小的,加入到新的链表中
if(l1.val<l2.val){
lr.next = l1;
l1 = l1.next;
}else{
lr.next = l2;
l2 = l2.next;
}
lr = lr.next;
lr.next = null;
}
lr.next = l1==null?l2:l1;
}
}
思路2:递归
递归的算法是参考官方答案,最开始我也没有想到。按照官方的说法,这个条件有着相同的要求,故此可以考虑递归。
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if (l1 == null) {
return l2;
} else if (l2 == null) {
return l1;
} else if (l1.val < l2.val) {
l1.next = mergeTwoLists(l1.next, l2);
return l1;
} else {
l2.next = mergeTwoLists(l1, l2.next);
return l2;
}
}
}
来源:力扣(LeetCode)
example:
——初学算法,知识不足。如有错误,还望请教。