Chinaunix首页 | 论坛 | 博客
  • 博客访问: 54505
  • 博文数量: 16
  • 博客积分: 650
  • 博客等级: 上士
  • 技术积分: 170
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-08 19:32
文章分类

全部博文(16)

文章存档

2008年(16)

我的朋友
最近访客

分类: C/C++

2008-06-16 20:08:22

深信服一道笔试:如何判断两个单向链表是否有相交,并找出交点。

题比较简单,单向链表有交点意思就是交点后的节点都是一样的了。

NODE* FindNode(NODE* pHead1, NODE* pHead2)
{
    NODE* p1 = pHead1;
    NODE* p2 = pHead2;
    int i = 1, j = 1, k = 0, f = 0;

    if(pHead2 == NULL || pHead2 == NULL)
    {
        return NULL;
    }

    while(p1->next != NULL)
    {
        p1 = p1->next;
        i++;
    }

    while(p2->next != NULL)
    {
        p2 = p2->next;
        j++;
    }

    if(p1 != p2)
    {
        return NULL;
    }
    else
    {
        p1 = pHead1;                // 1
        p2 = pHead2;

        f = fabs(i, j);
        if(i > j)                    // 2
        {
            for(k=0; k<f; k++)
            {
                p1 = p1->next;
            }
            while(p1 != p2)
            {
                p1 = p1->next;
                p2 = p2->next;
            }
            return p1;
        }
        else
        {
            for(k=0; k<f; k++)
            {
                p2 = p2->next;
            }
            while(p1 != p2)
            {
                p1 = p1->next;
                p2 = p2->next;
            }
            return p1;
        }
    }
}

1,在第一次遍历完链表后,进行第二次遍历,需要把指针再次初始化;看见网上一些人给的例子没有再次初始化显然是错误的;再调用NULL的next不死才怪!

2,小优化。循环和判断,把判断放在外面;如果把i和j大小判断放在里面的话就意味着循环多少次,判断就执行多少次;当然这样做的唯一不足就是代码多了点;还有for循环之前的对f的赋值,有的为了简便直接放在for语句里面,不过同样道理,放在for循环里面,就执行了n次的fabs;拿出来赋值,只赋值一次就OK。

友情提示:养成写高效代码的习惯,不能图简便,觉得代码越少就越牛!

阅读(2369) | 评论(4) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2008-11-21 12:50:28

算法不错。 应该是:f=abs(i-j)吧,i和j不可能是float型吧。

chinaunix网友2008-11-21 12:50:25

算法不错。 应该是:f=abs(i-j)吧,i和j不可能是float型吧。

chinaunix网友2008-11-21 12:50:16

算法不错。 应该是:f=abs(i-j)吧,i和j不可能是float型吧。

chinaunix网友2008-10-28 21:47:49

f = fabs(i, j); 这句话写错了吧,应该是 f = fabs(i-j);