每日一刷——1.判断两个链表是否相交,若相交求交点(链表不带环&带环)2.fork()问题

本文探讨了链表相交问题的两种解决方案,一种针对无环链表,另一种适用于可能带环的链表。此外,还分析了一个涉及fork()函数的C语言程序,解释了其运行时的输出结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.判断两个链表是否相交,若相交,求交点。(假设链表不带环)

Node* GetMeetNode(Node* l1,Node* l2)//获取相交链表的相交节点
{
    assert(l1);
    assert(l2);
    Node* p1 = l1;
    Node* p2 = l2;
    int len1 = 0;
    int len2 = 0;
    while (p1)
    {
        p1 = p1->_next;
        len1++;
    }
    while (p2)
    {
        p2 = p2->_next;
        len1++;
    }
    int sub;
    sub= myabs(len1,len2);
    Node* longNode;
    Node* shortNode;
    if (len1 > len2)
    {
        longNode = l1;
        shortNode = l2;
    }
    else
    {
        longNode = l2;
        longNode = l1;
    }
    while (sub--)
    {
        longNode = longNode->_next;
    }
    while (longNode != shortNode)
    {
        longNode = longNode->_next;
        shortNode = shortNode->_next;
    }
    return shortNode;
}

2.判断两个链表是否相交,若相交,求交点。(假设链表可能带环)

int* GetMeetNodeWithCircle(Node* l1,Node* l2)
{
    assert(l1);
    assert(l2);
    Node* meet1 = GetMeetNodeInCycle(l1);
    Node* meet2 = GetMeetNodeInCycle(l2);
    if (meet1 != NULL&&meet2 != NULL)
    {
        Node* cur = meet1;
        while (meet1 != cur->_next)
        {
            if (meet2 == cur)
            {
                return 1;
            }
            cur = cur->_next;
        }
    }
    return NULL;
}

3-请问下面的程序一共输出多少个“-”?

int main(void) 
{ 
int i; 
for(i=0; i<2; i++){ 
fork(); 
printf("-"); 
} 

return 0; 
}

初见此题时,我们会认为结果是输出6个“-”,但是真正将程序跑一遍我们就可知程序实际上输出了8个“-”
我们知道,fork()函数有一次调用两次返回的特点,如果子进程创建成功,则给子进程返回0,给父进程返回子进程的进程id;
在fork时,子进程会拷贝父进程的缓冲区,指令,变量值,程序调用栈,环境变量。
本次printf本身带有缓冲区(buffer),所以两次fork(),子进程就会多拷贝两次缓冲区内容,所以最后输出8个而不是6个。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值