day04之链表不带环相交+带环相交问题+fork函数输出几个短线
2017-07-17 00:50
423 查看
判断两个链表是否相交,若相交,求交点。(假设链表不带环)
判断两个链表是否相交,若相交,求交点。(假设链表可能带环)【升级版】
下面的代码最终输出几个短线?
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个短线
相关文章推荐
- 判断两个链表是否相交,若相交,求交点,若带环呢/fork继承问题
- 链表相交带环问题+复杂链表的复制
- 链表带环和相交的问题
- 7.微软亚院之编程判断俩个链表是否相交(为了简化问题,我们假设俩个链表均不带环)
- 带环链表得几个问题
- 带环单链表及链表相交问题的分析及代码实现
- 65. 链表是否带环、环入口、环长度、链表相交问题分析与总结
- 链表中的带环相交问题
- 带环链表的几个问题
- C语言强化(七)链表相交问题_3 判断链表是否带环
- 《C语言实现链表相交、带环问题》
- C语言强化(七)链表相交问题_3 判断链表是否带环
- 数据结构_链表问题(倒序打印、相交、带环)
- 链表面试题总结----(可能带环相交问题+复杂链表的复制)
- 每日一刷——1.判断两个链表是否相交,若相交求交点(链表不带环&带环)2.fork()问题
- APUE-8.3节fork函数实例,printf输出两次问题
- 两链表相交问题
- 判断单链表是否存在环,判断两个链表是否相交问题详解
- 单链表中的一些经典问题--约瑟夫环,逆序,查找,复杂链表复制,链表带环问题
- 链表的几个经典问题