合并两个排序的链表

Posted ctz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了合并两个排序的链表相关的知识,希望对你有一定的参考价值。

题目

输入两个递增排序的链表,合并这两个链表并使新链表中的节点人是按照递增排序的。

思路

两个链表分别都已经是有序的了,遍历链表的时候只要比较两个链表当前位置大小,取出最小的添加到新链表中。

#include <iostream>
using namespace std;

struct node
{
    int data;
    struct node *next;
};
class Solution
{
    public:
        Solution();
        void create();
        void print();
        void merge(node *h);
        node *r_merge(node *h1,node *h2);
        node *head;
};
Solution::Solution()
{
    head=new node();
    head->next=nullptr;
    head->data=0;
}
void Solution::create()
{
    if(head==nullptr)
        return;
    auto t=head;
    int x;
    while(1)
    {
        cin>>x;
        if(x)
        {
            t->next=new node();
            t=t->next;
            t->data=x;
            t->next=nullptr;
        }
        else
        {
            t->next=nullptr;
            break;
        }
    }
} 
void Solution::print()
{
    auto n=head;
    while(n)
    {
        cout<<n->data<<endl;
        n=n->next;
    }
}
void Solution::merge(node *h)
{
    if(!head||!h||!head->next||!h->next)
        return;
        
    node *h1=head->next;
    node *h2=h->next;
    node *h3=head;
    h3->next=nullptr;
    while(h1&&h2)
    {
        if(h1->data<=h2->data)
        {
            h3->next=h1;
            h3=h3->next;
            h1=h1->next;
        }
        else
        {
            h3->next=h2;
            h3=h3->next;
            h2=h2->next;
        }
    }
    if(h1)
        h3->next=h1;
    else
        h3->next=h2;
}
node *Solution::r_merge(node *h1,node *h2)
{
    if(!h1)
        return h2;
    else if(!h2)
        return h1;
        
    node *h3=nullptr;
    if(h1->data<=h2->data)
    {
        h3=h1;
        h3->next=r_merge(h1->next,h2);
    }
    else
    {
        h3=h2;
        h3->next=r_merge(h1,h2->next);
    }
    return h3;
}
int main()
{
    Solution s,S;
    s.create();
    S.create();
    //s.merge(S.head);
    s.head=s.r_merge(s.head->next,S.head->next);
    s.print();
    return 0;
}

 

以上是关于合并两个排序的链表的主要内容,如果未能解决你的问题,请参考以下文章

代码的鲁棒性:合并两个排序的链表

《剑指Offer》题目:合并两个排序的链表

最强解析面试题:合并两个排序的链表

剑指offer合并两个排序的链表

16.合并两个排序的链表

合并两个排序的链表