算法3:程序21-22

程序21:拷贝含随机指针的链表

#include<iostream> //拷贝含随机指针的链表
using namespace std;
#include<hash_map>

struct Node
{
    int value;
    Node*next;
    Node*random;
    Node(int val)
    {
        value=val;
        next=NULL;
        random=NULL;
    }
};

Node* copyListWithRand1(Node *head)  //未完成
{
    if(head==NULL)
    {
        return NULL;
    }
}
Node* copyListWithRand2(Node *head)  //额外空间为O(1)
{
    if(head==NULL)
    {
        return NULL;
    }
    Node* cur=head;
    Node*next=NULL;
    while (cur!=NULL)
    {
        next=cur->next;
        cur->next=new Node(cur->value); //在new的同时将值拷了进去
        cur->next->next=next;
        cur=next;
    }
    cur=head;
    Node*copy=NULL;
    while(cur!=NULL)
    {
        copy=cur->next;
        copy->random=cur->random==NULL?NULL:cur->random->next;
        cur=cur->next->next;
    }

    cur=head;
    Node*res=cur->next;
    while(cur!=NULL)
    {
        next=cur->next->next;
        copy=cur->next;
        cur->next=next;
        copy->next=next==NULL?NULL:next->next;
        cur=next;
    }
    return res;

};
int main()
{

    Node *head1 = NULL;
    head1=new Node(1);
    head1->next=new Node(2); //一定要new;用类似于有参构造初始化
    Node*res=copyListWithRand2(head1);
    cout<<res->value<<endl;
    cout<<head1->next->random;

    return 0;
}

程序22:两个单链表相交的一系列问题

#include<iostream> //两个单链表相交的一系列问题
using namespace std;

struct Node
{
    int value;
    Node *next;
    Node(int val)
    {
        value=val;
        next=NULL;
    } 
};


Node* getLoopNode(Node* head)
{
    if(head==NULL||head->next==NULL||head->next->next==NULL)
    {
        return NULL;
    }
    Node* n1=head->next;
    Node* n2=head->next->next;
    while(n1!=n2)
    {
        if(n1==NULL||n2==NULL)
        {
            return NULL;
        }
        n1=n1->next;
        n2=n2->next->next;
    }
    n2=head;
    while (n1!=n2)
    {
        n1=n1->next;
        n2=n2->next;
    }
    return n1;
}

Node* noLoop(Node* head1,Node* head2)
{
    if(head1==NULL||head2==NULL)
    {
        return NULL;
    }
    int n=0;
    Node* cur1=head1;
    Node* cur2=head2;
    while (cur1!=NULL)
    {
        n++;
        cur1=cur1->next;
    }
    while (cur2!=NULL)
    {
        n--;
        cur2=cur2->next;
    }
    if(cur1!=cur2)
    {
        return NULL;
    }    
    cur1=n>0?head1:head2;
    cur2=cur1==head1?head2:head1;
    n=abs(n);
    while (n!=0)
    {
        cur1=cur1->next;
        n--;
    }
    while (cur1!=cur2)
    {
        cur1=cur1->next;
        cur2=cur2->next;
    }
    return cur1;
}
Node* bothLoop(Node* head1,Node* loop1,Node* head2,Node* loop2)
{
    Node* cur1=NULL;
    Node* cur2=NULL;
    if(loop1==loop2)
    {
        cur1=head1;
        cur2=head2;
        int n=0;
        while (cur1!=loop1)
        {
            n++;
            cur1=cur1->next;
        }
        while (cur2!=loop2)
        {
            n--;
            cur2=cur2->next;
        }
        cur1=n>0?head1:head2;
        cur2=cur1==head1?head2:head1;
        n=abs(n);
        while (n!=0)
        {
            cur1=cur1->next;
            n--;
        }
        while (cur1!=cur2)
        {
            cur1=cur1->next;
            cur2=cur2->next;
        }
        return cur1;      
    }
    else
    {
        cur1=loop1->next;
        while(cur1!=loop1)
        {
            if(cur1==loop2)
            {
                return loop2;
            }
            cur1=cur1->next;
        }
        return NULL;
    }

}

Node* getIntersectNode(Node* head1,Node* head2)
{
    if(head1==NULL||head2==NULL)
    {
        return NULL;
    }
    Node* loop1=getLoopNode(head1);
    Node* loop2=getLoopNode(head2);
    if(loop1==NULL&&loop2==NULL)
    {
        return noLoop(head1,head2);
    }
    if(loop1!=NULL&&loop2!=NULL)
    {
        return bothLoop(head1,loop1,head2,loop2);
    }
    return NULL;
}

int main()
{
    Node *head1=NULL;
    head1=new Node(1);
    Node* cur=new Node(2);
    cout<<cur<<endl;
    head1->next=cur;

    Node* head2=new Node(3);
    head2->next=cur;

    cout<<getIntersectNode(head1,head2);

    return 0;
}
全部评论

相关推荐

03-15 10:59
已编辑
美团_后端开发(实习员工)
爱写代码的菜code...:哎,自己当时拿到字节offer的时候也在感叹终于拿到了,自己当时最想去的企业就是字节,结果还是阴差阳错去了鹅厂。祝uu一切顺利!!!
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
# 春招至今,你的战绩如何? #
8665次浏览 80人参与
# 你的实习产出是真实的还是包装的? #
1619次浏览 40人参与
# MiniMax求职进展汇总 #
23671次浏览 305人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
7337次浏览 40人参与
# 重来一次,我还会选择这个专业吗 #
433258次浏览 3926人参与
# 简历第一个项目做什么 #
31475次浏览 324人参与
# 巨人网络春招 #
11287次浏览 223人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
186809次浏览 1118人参与
# 不考虑薪资和职业,你最想做什么工作呢? #
152237次浏览 887人参与
# 研究所笔面经互助 #
118840次浏览 577人参与
# 简历中的项目经历要怎么写? #
309904次浏览 4183人参与
# 面试紧张时你会有什么表现? #
30466次浏览 188人参与
# 你今年的平均薪资是多少? #
212956次浏览 1039人参与
# AI时代,哪些岗位最容易被淘汰 #
63247次浏览 793人参与
# 我的求职精神状态 #
447945次浏览 3128人参与
# 你最满意的offer薪资是哪家公司? #
76388次浏览 374人参与
# 高学历就一定能找到好工作吗? #
64275次浏览 620人参与
# 牛客AI文生图 #
21395次浏览 238人参与
# 你怎么看待AI面试 #
179751次浏览 1224人参与
# 正在春招的你,也参与了去年秋招吗? #
363105次浏览 2635人参与
# 腾讯音乐求职进展汇总 #
160539次浏览 1109人参与
# 职能管理面试记录 #
10787次浏览 59人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务