求两个链表相交点的算法及完整源代码
在实际开发中,经常遇到需要查找两个链表的相交点的情况。本文将介绍一种基于C语言的求解方法,并附上完整的源代码和相应的描述。
- 问题描述
假设有两个单链表A和B,它们可能相交在某个节点处,也可能不相交。现在需要编写一个函数,找出两个链表的相交点,如果不相交则返回NULL。要求时间复杂度为O(n),空间复杂度为O(1)。
- 求解思路
我们可以用两个指针pA和pB分别指向链表A和B的头节点,然后依次遍历两个链表。当pA遍历到链表A的尾部时,将它重定位到链表B的头部;当pB遍历到链表B的尾部时,将它重定位到链表A的头部。这样,pA和pB就分别从另一个链表的头部开始遍历,直到它们相遇或遍历了整个链表为止。
如果两个链表相交,则它们的相交点必然在遍历过程中被找到;如果不相交,则遍历完整个链表之后pA和pB都指向NULL。
- 源代码实现
下面是完整的C语言源代码实现,其中Node表示单链表节点的结构体:
/* 定义单链表节点结构体 */
struct Node {
int val;
struct Node *next;
};
/* 求解两个链表相交点的函数 */
struct Node* getIntersectionNode(struct Node* headA, struct Node* headB) {
struct Node *pA = headA, *pB = headB;
whi