day04之链表不带环相交+带环相交问题+fork函数输出几个短线

来源:互联网 发布:米兔源码 编辑:程序博客网 时间:2024/05/17 03:05
  • 判断两个链表是否相交,若相交,求交点。(假设链表不带环)
struct ListNode{    int val;    ListNode *next;    ListNode(int x):val(x),next(NULL) {  }};bool IsCross(ListNode *phead1, ListNode *phead2){    if(phead1 == NULL || phead2 == NULL)        return false;    ListNode *p1 = phead1;    ListNode *p2 = phead2;    while(p1->next)    {        p1 = p1->next;    }    while(p2->next)    {        p2 = p2->next;    }    return p1==p2;}size_t ListSize(ListNode *phead){    if(phead == NULL)        return 0;    int size = 0;    while(phead)    {        size++;        phead = phead->next;    }    return size;}ListNode *GetCross(ListNode *phead1, ListNode *phead2){    if(phead1 == NULL || phead2 == NULL)        return NULL;    if(! IsCross(phead1, phead2))        return NULL;    ListNode *p1 = phead1;    ListNode *p2 = phead2;    int size1 = ListSize(phead1);    int size2 = ListSize(phead2);    int step = size1-size2;    if(step > 0)    {        while(step--)        {            p1 = p1->next;        }        while(p1 != p2)        {            p1 = p1->next;            p2 = p2->next;        }    }    else    {        step = -step;        while(step--)        {            p2 = p2->next;        }        while(p1 != p2)        {            p1 = p1->next;            p2 = p2->next;        }    }    return p1;}
  • 判断两个链表是否相交,若相交,求交点。(假设链表可能带环)【升级版】
struct ListNode{    int val;    ListNode *next;    ListNode(int x):val(x),next(NULL) {  }};ListNode *IsHaveLoop(ListNode *phead){    if(phead == NULL)        return NULL;    ListNode *pfast = phead;    ListNode *pslow = phead;    while(pfast && pfast->next)    {        pfast = pfast->next->next;        pslow = pslow->next;        if(pfast == pslow)            return pfast;    }    return NULL;}//求环的入度点ListNode *EntryNode(ListNode *phead){    ListNode *pmeetnode = IsHaveLoop(phead);    if(pmeetnode == NULL)        return NULL;    ListNode *p1 = phead;    ListNode *p2 = pmeetnode;    while(p1 != p2)    {        p1 = p1->next;        p2 = p2->next;    }    return p1;}size_t ListSize(ListNode *phead){    if(phead == NULL)        return 0;    int size = 0;    while(phead)    {        size++;        phead = phead->next;    }    return size;}ListNode *noloop(ListNode *phead1, ListNode *phead2){    if(phead1 == NULL && phead2 == NULL)        return NULL;    ListNode *p1 = phead1;    ListNode *p2 = phead2;        while(p1->next)        {            p1 = p1->next;        }        while(p2->next)        {            p2 = p2->next;        }        if(p1 != p2)   //无环,不相交。            return NULL;         //无环,相交。    int size1 = ListSize(phead1);    int size2 = ListSize(phead2);    p1 = phead1;    p2 = phead2;        int step = size1-size2;        if(step > 0)        {            while(step--)            {                p1 = p1->next;            }            while(p1 != p2)            {                p1 = p1->next;                p2 = p2->next;            }        }        else        {            step = -step;            while(step--)            {                p2 = p2->next;            }            while(p1 != p2)            {                p1 = p1->next;                p2 = p2->next;            }        }        return p1;}ListNode *bothloop(ListNode *phead1, ListNode *phead2){    if(phead1 == NULL || phead2 == NULL)        return NULL;        ListNode *pEntryNode1 = EntryNode(phead1);        ListNode *pEntryNode2 = EntryNode(phead2);        if(pEntryNode1 == pEntryNode2) //相交第一种情况: 交点在入度点或入度点之前。        {            ListNode *p1 = phead1;            ListNode *p2 = phead2;            int size1 = 0;            int size2 = 0;            while(p1 != pEntryNode1)            {                size1++;                p1 = p1->next;            }            while(p2 != pEntryNode2)            {                size2++;                p2 = p2->next;            }            int step = size1-size2;            p1 = phead1;            p2 = phead2;            if(step > 0)            {                while(step--)                {                    p1 = p1->next;                }                while(p1 != p2)                {                    p1 = p1->next;                    p2 = p2->next;                }            }            else            {                step = -step;                while(step--)                {                    p2 = p2->next;                }                while(p1 != p2)                {                    p1 = p1->next;                    p2 = p2->next;                }            }            return p1;        }        else   //入度点不同,两种情况,一种情况是相交在环上,另一种是不相交        {            ListNode *pcur = pEntryNode1->next;            while(pcur != pEntryNode1)            {                if(pcur == pEntryNode2)                {                    return pEntryNode2; //相交在环上                 }                pcur = pcur->next;            }        }        return NULL;  //不相交}//此时链表可能带环,(1)两个链表不带环有可能相交,(2)一个带环一个不带环肯定不可能相交 (3)两个带环可能相交ListNode *GetCross(ListNode *phead1, ListNode *phead2){    if(phead1 == NULL || phead2 == NULL)        return NULL;    ListNode *pmeetnode1 = IsHaveLoop(phead1);    ListNode *pmeetnode2 = IsHaveLoop(phead2);    if(pmeetnode1 == NULL && pmeetnode2 == NULL)// 情况一:都无环    {        return noloop(phead1, phead2);    }    else if(pmeetnode1 != NULL && pmeetnode2 != NULL) //情况二:都带环    {        return bothloop(phead1, phead2);    }    return NULL;  //情况三:一个带环,一个不带环,肯定不相交。}
  • 下面的代码最终输出几个短线?
#include <stdio.h> #include <unistd.h>#include <sys/stats.h>int main(void) { int i; for(i=0; i<2; i++){ fork(); printf("-"); } return 0; }
最终输出8个短线,printf函数是行缓冲,当i = 0,第一个进程和第二个进程都有一个短线,因为没有\n,没有刷新,当i = 1,第三个和第四个进程都继承父进程一个短线,然后这四个进程再次输出短线,最终输出8个短线
阅读全文
0 0
原创粉丝点击