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
- day04之链表不带环相交+带环相交问题+fork函数输出几个短线
- 带环相交
- 每日一刷——1.判断两个链表是否相交,若相交求交点(链表不带环&带环)2.fork()问题
- 判断两个链表是否相交,若相交,求交点,若带环呢/fork继承问题
- 链表中的带环相交问题
- 《C语言实现链表相交、带环问题》
- ]数据结构:单链表之判断两个链表是否相交及求交点(带环、不带环)
- 带环单链表及单链表的相交
- 判断带环链表相交的点
- 7.微软亚院之编程判断俩个链表是否相交(为了简化问题,我们假设俩个链表均不带环)
- 判断俩个链表是否相交,若相交求交点(考虑带环和不带环)
- 判断两个链表是否相交,若相交,求交点:1.不带环。2.有可能带环
- <笔试><面试>C/C++单链表相关(4)判断两链表是否相交,求交点(链表不带环/可能带环)
- C语言强化(七)链表相交问题_3 判断链表是否带环
- 带环单链表及链表相交问题的分析及代码实现
- 链表面试题总结----(可能带环相交问题+复杂链表的复制)
- 1.判断两个链表是否相交,若相交,求交点。(假设链表不带环)2.判断两个链表是否相交,若相交,求交点。(假设链表可能带环)【升级版】
- 链表--1.判断两个链表是否相交,若相交,求交点。(假设链表不带环)2.判断两个链表是否相交,若相交,求交点。(假设链表可能带环)
- Unity3d 之界面介绍
- 私の故郷
- shell实现彩色进度条
- 下拉式终端:Guake
- 判断两个链表是否相交(考虑带环与不带环)
- day04之链表不带环相交+带环相交问题+fork函数输出几个短线
- [LeetCode]637. Average of Levels in Binary Tree
- 设计类不能被继承 、只能在堆上创建对象、只能在栈上创建对象。
- POJ 1005--I Think I Need a Houseboat
- static关键字注意事项_对"静态只能访问静态"的理解_(注意指的是一个类中)
- 关于 小米华为手机 不能正确安装游戏包的问题
- 服务器的种类
- Python读取excel
- zk 笔记