初级算法:合并两个有序链表

合并两个有序链表
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

示例:

输入: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;
    }
};
发布了36 篇原创文章 · 获赞 0 · 访问量 616

猜你喜欢

转载自blog.csdn.net/weixin_43199933/article/details/103018391