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

来源:互联网 发布:人工智能原理与应用 编辑:程序博客网 时间:2024/06/06 14:01

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个。

阅读全文
0 0
原创粉丝点击