合并两个有序链表
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
不会 看的题解
思路1:递归
先检查是否为空 其中一个为空 直接返回非空链表 两个都为空的话 返回NULL
先比较两个链表的头结点,较小的选择作为后续所有元素的头结点,后续元素是将较小元素的后一个节点作为头结点的剩余链表,与另没变化的链表作为参数再次调用mergeTwoLists函数 以此类推。
没看懂的地方时 递归调用后 返回值 和递归结束的条件?
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
if(l1==NULL){
if(l2==NULL)return NULL;
else
return l2;
}
else if(l2==NULL){
if(l1==NULL)return NULL;
else
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;
}
}
};
思路二:迭代法
思路比较顺畅 最好画图理解 类似于双指针的感觉
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
if(l1==NULL){
return l2;
}
else if(l2==NULL){
return l1;
}
//prehead节点用于保存第一个节点 方便在最后返回头结点时 可以找到
//pre节点保存当前节点之一 pre是不断更新的
ListNode* prehead=new ListNode(-1); //值-1是随便给的吧
ListNode* pre=prehead;
//循环结束条件时 只要有一个链表为空
while(l1!=NULL&&l2!=NULL){
if(l1->val<=l2->val){
pre->next=l1; //第一个循环开始时 pre是prehead
l1=l1->next;
}
else{
pre->next=l2;
l2=l2->next;
}
pre=pre->next;
}
//此时 可能l1或者l2之一为NULL 直接将剩余的拼接在后面即可
pre->next=l1==NULL?l2:l1;
//prehead的下一个即是合并后的链表
return prehead->next;
}
};