题目
给定两个单链表,编写算法找出两个链表的公共结点
思路
如果两个链表有公共结点,那么必定是链表的末尾部分重合。考虑到链表长度不相同的情况,我们可以先求得两个链表的长度之差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
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。