题目
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
思路
这题感觉思路很简单,没有对空间复杂度有要求,那就是新建一个链表C,双指针指向AB头结点,然后比较大小,小的放进去然后移动指针。注意点:
1、dummyhead
2、边界
3、C 在放入值之后它的指针也要移动
代码
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if(l1 == null){
return l2;
}
if (l2 == null){
return l1;
}
ListNode L3 = new ListNode(0);
ListNode l3 = L3;
ListNode A = l1;
ListNode B = l2;
while(A != null && B != null){
if(A.val <= B.val){
l3.next = A;
A = A.next;
}
else{
l3.next = B;
B = B.next;
}
// 这里老是会忘l3要后移一位,谨记谨记,以后可以先把思路明确写出来在动手先,避免这种遗漏
l3 = l3.next;
}
l3.next = A == null ? B : A;
return L3.next;
}
}
思路2——递归
递归就是明确这个节点要做什么,这个节点要做的就是:
比较大小,然后将小的值放入链表,小的指针后移一步。
然后明确一下递归入口参数和出口返回:
入口参数应该就是两个链表,出口返回就是新的链表。
出口返回这想错了,因为递归嘛,应该就是直接返回值小的那个
都明确了就开始写了,不要想细节,细节交给递归。
其实真的开始写这个递归了,还是觉得有点云里雾里
重新来看一下就明白了。就是较小的值next指向剩余结果的递归结果(将函数功能带进去看,不看具体实现)
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if(l1 == null){return l2;}
if(l2 == null){return l1;}
// mergeTwolists的功能就是合并升序链表
// l1值小的时候,它的next指向了l1剩下部分和l2的升序结果
// 返回l1
if(l1.val <= l2.val){
l1.next = mergeTwoLists(l1.next,l2);
return l1;
}else{
l2.next = mergeTwoLists(l2.next,l1);
return l2;
}
}
}