阿里巴巴2014校园招聘算法题

来源:互联网 发布:丁丁软件是什么情况 编辑:程序博客网 时间:2024/06/16 16:01

题目:两个较长的单向链表a和b,为了找出节点node满足node in a 并且node in b。请设计空间使用尽量小的算法(用c/c++,java 或者伪代码)

思路:我们定义节点的距离为节点到链表开始所经过的节点数。如果两个链表长度相同,则相交节点其在两个链表上的距离一定相等。对于长度不同的两个链表,我们可以采用对齐的方式,使其向长度短的链表对齐。这样就可以应用上面的思路

具体算法如下:

struct node  {      int v;      node *next;  };  /* 返回链表的长度 链表为空 返回0 */  size_t listLen(node * p)  {      size_t num = 0;      while (p!=NULL)      {          num++;          p = p->next;      }      return num;  }  // 如果找到了 则返回指针 指向公共节点  // 如果不存在 则返回空指针  node * findFirstCommenNode(node * pheada, node * pheadb)  {      size_t lenA = listLen(pheada);      size_t lenB = listLen(pheadb);        node * plistA = pheada;      node * plistB = pheadb;      //调整长度,让plistA 指向较长的一个链表     if (lenA < lenB)      {          plistB = pheada;          plistA = pheadb;          size_t t = lenA;          lenA = lenB;          lenB = t;      }      while(lenA > lenB)      {          plistA = plistA->next;          --lenA;      }      //一样长了      //寻找公共节点      while (plistA!=NULL && plistA != plistB)      {          plistA = plistA->next;          plistB = plistB->next;      }      return plistA;  }  

算法的空间复杂度O(1),时间复杂度O(m+n)

原创粉丝点击