题目

给定两个单链表,编写算法找出两个链表的公共结点

思路

如果两个链表有公共结点,那么必定是链表的末尾部分重合。考虑到链表长度不相同的情况,我们可以先求得两个链表的长度之差dist,让长的链表先走dist步,接着就可以进行同步比较了,当比较出的结点相同时,则意味着该结点为公共结点。
解决的方法可以分为如下三步:

  • 求两表长度长度之差dist
  • 让长的链表下走dist
  • 开始进行同步比较,遇到相同结点即为公共结点

代码

node\* get\_common\_node(node\* a, node\* b) {

 unsigned int lena = getlen(a);

 unsigned int lenb = getlen(b);

 int dist = lena - lenb; // get the dist len between a and b.

 node \*longlist, \*shortlist;

 if (dist >= 0) {

 longlist = a;

 shortlist = b;

 } else {

 dist = -dist;

 longlist = b;

 shortlist = a;

 }

  

 while (dist\--) { // the longer list take 'dist' step first.

 longlist = longlist\->next;

 }

  

 while (longlist != NULL) {

 if (longlist == shortlist)

 return longlist;

 longlist = longlist\->next;

 shortlist = shortlist\->next;

 }

 return NULL; // no common nodes

}

AaronRobert
1 声望0 粉丝

引用和评论

0 条评论