牛客题解 | 链表合并

题目

题目链接

题解:

考察点: 链表,迭代,递归

易错点:

\(1.\)题目只给定链表,并不确定链表中元素的个数。很多同学不会读入。因为输入由整数和空格构成,建议当成字符串读入,使用\(getline\)按行读入,因为\(cin\)无法处理空格。同时推荐使用\(stringstream\)类对输入进行解析

\(2.\)很多同学不会写链表,其实链表的表示非常简单,可以定义为由值\(val\)和指向下一个结点指针\(next\)构成的结构体,同时C++ 中最好使用构造函数为\(val\)\(next\)赋上初值

方法一:迭代

当链表\(l_1\)\(l_2\)均不为空时,分别设置两个指针指向\(l_1\)\(l_2\),当\(l_1\)中元素较小时,选取\(l_1\)中的元素,并把\(l_1\)的指针后移;当\(l_2\)中元素较小时,选取\(l_2\)中元素,并把指针后移。此时,如果\(l_1\)还有剩余,将排序好的链表直接指向\(l_1\);如果\(l_2\)还有剩余,则将排序好的链表指向\(l_2\)

#include "bits/stdc++.h"
using namespace std;
struct ListNode{
    int val;
    ListNode *next;
    ListNode(int x): val(x),next(NULL){}
};
ListNode* merge(ListNode *l1,ListNode *l2){
    if(l1==NULL) return l2;
    if(l2==NULL) return l1;
    ListNode *q=new ListNode(0);
    ListNode *p=q;
    while(l1&&l2){
        if(l1-&gt;val<l2->val){
            p-&gt;next=l1;
            l1=l1-&gt;next;
        }else{
            p-&gt;next=l2;
            l2=l2-&gt;next;
        }
        p=p-&gt;next;
    }
    if(l1){
        p-&gt;next=l1;
    }
    if(l2){
        p-&gt;next=l2;
    }
    return q-&gt;next;
}
int main()
{
    ListNode *l=new ListNode(0);
    ListNode *l1=l;
    int x,n=0;
    string s;
    getline(cin,s);
    stringstream ss1(s);
    while(ss1&gt;&gt;x){
        l1-&gt;next=new ListNode(x);
        l1=l1-&gt;next;
        ++n;
    }
    s="";
    getline(cin, s);
    stringstream ss2(s);
    ListNode *r=new ListNode(-1);
    ListNode *l2=r;
    while(ss2&gt;&gt;x){
        l2-&gt;next=new ListNode(x);
        l2=l2-&gt;next;
        ++n;
    }
    ListNode *res=merge(l-&gt;next,r-&gt;next);
    for(int i=0;i<n;i++){ if(i="=n-1){" printf("%d\n",res->val);
        }else{
            printf("%d ",res-&gt;val);
        }
        res=res-&gt;next;
    }
    return 0;
}

方法二:递归

\(l_1\)\(l_2\)为空时,是递归的终止条件,因为此时只需要返回另一个链表即可。否则需要判断\(l_1\)\(l_2\)哪一个头元素更小,然后递归地将更小那个视为下一个添加到结果里的值。

#include "bits/stdc++.h"
using namespace std;
struct ListNode{
    int val;
    ListNode *next;
    ListNode(int x): val(x),next(NULL){}
};
ListNode* merge(ListNode *l1,ListNode *l2){
    if(l1==NULL) return l2;
    if(l2==NULL) return l1;
    if(l1-&gt;val<l2->val){
        l1-&gt;next=merge(l1-&gt;next,l2);
        return l1;
    }else{
        l2-&gt;next=merge(l1,l2-&gt;next);
        return l2;
    }

}
int main()
{
    ListNode *l=new ListNode(0);
    ListNode *l1=l;
    int x,n=0;
    string s;
    getline(cin,s);
    stringstream ss1(s);
    while(ss1&gt;&gt;x){
        l1-&gt;next=new ListNode(x);
        l1=l1-&gt;next;
        ++n;
    }
    s="";
    getline(cin, s);
    stringstream ss2(s);
    ListNode *r=new ListNode(-1);
    ListNode *l2=r;
    while(ss2&gt;&gt;x){
        l2-&gt;next=new ListNode(x);
        l2=l2-&gt;next;
        ++n;
    }
    ListNode *res=merge(l-&gt;next,r-&gt;next);
    for(int i=0;i<n;i++){ if(i="=n-1){" printf("%d\n",res->val);
        }else{
            printf("%d ",res-&gt;val);
        }
        res=res-&gt;next;
    }
    return 0;
}

</n;i++){></n;i++){>

posted @ 2025-03-11 10:50  wangxiaoxiao  阅读(32)  评论(0)    收藏  举报