题解 | #链表合并#

链表合并

https://www.nowcoder.com/practice/27c833289e5f4f5e9ba3718ce9136759

#include <iostream>
#include <stdio.h>
#include <sys/types.h>
using namespace std;
typedef struct ListNode
{
    int data;
    struct ListNode* next;
    ListNode(int data=0):data(data),next(nullptr)
    {}

}ListNode;
class SingleList
{
    public:
    SingleList()
    {
        head=new ListNode();
        tail=head;
    }
    ~SingleList()
    {
        for(ListNode* p=head;p!=nullptr;)
        {
            ListNode* t=p;
            p=p->next;
            delete t;
            t=nullptr;
        }
        tail=nullptr;
        head=nullptr;
    }
    void push_back(int val)
    {
        ListNode* p=new ListNode(val);
        tail->next=p;
        tail=p;
    }
    ListNode* gethead()
    {
        return head;
    }
    private:
    ListNode* head;
    ListNode* tail;
};
void mergelist(ListNode* head1,ListNode* head2)
{
    ListNode* p=head1->next;
    ListNode* q=head2->next;
    ListNode* tail=head1;//head1或head2都可以,最终head1和head2都是指向一条链表
    head2->next=nullptr;//这里要避免两条链表节点的二次析构
    while(p!=nullptr&&q!=nullptr)
    {
        if(q->data<p->data)
        {
            tail->next=q;
            q=q->next;
        }
        else 
        {
            tail->next=p;
            p=p->next;
        }
        tail=tail->next;
    }
    if(p==nullptr)
    {
        tail->next=q;
    }
    else 
    {
        tail->next=p;
    }
}
int main() {
    SingleList list1;
    int data;
    while(scanf("%d",&data)!=-1)
    {
        list1.push_back(data);
        if(getchar()=='\n')break;//必须加上这句话,不然会出问题
    }
    SingleList list2;
    while(scanf("%d",&data)!=-1)
    {
        list2.push_back(data);
        if(getchar()=='\n')break;
    }
    mergelist(list1.gethead(), list2.gethead());
    for(ListNode* p=list1.gethead()->next;p!=nullptr;p=p->next)
    {
        cout<<p->data<<" ";
    }
    return 0;
}
// 64 位输出请用 printf("%lld")

可以使用双指针的思想进行求解,两个指针分别指向两条链表,但是还要增加一个tail指针,作为合并链表的末尾节点,tail永远会接上两个指针中值小的那个(从小到大排序的情况),当一个指针为空时,tail就接上指向了另一条链表的那个指针就行了,需要注意析构函数的问题,在析构两条链表的时候,会再次析构同一个节点,只需要将一条链表的头节点指向空就行了。

全部评论

相关推荐

和蔼:在竞争中脱颖而出,厉害! 但是有一个小问题:谁问你了?😡我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了
点赞 评论 收藏
分享
勤劳的香菇求被捞求offer:满帮笔试都不给我发 似乎被卡本了
投递满帮集团等公司10个岗位
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务