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