原题题目:
这道题是链表问题里面较为基础的几道题之一,查找两个链表是否存在交点,要求O(n)的时间复杂度,和O(1)的空间复杂度。
算法的思路也比较简单,如下几个步骤:
1. 获取两个链表的长度,分别为La和Lb;
2. 让长度较长的链表先遍历,消除他们之间的差别,假设链表A较长,则A先前进(La - Lb)步,这时,两个链表剩余的长度一致,若存在交点,则交点也只能存在于后面等长的序列中;
3. 两个链表逐步遍历,每次均前进一步,若当前节点相等则返回,否则当遍历结束后仍未发现交叉节点,则返回NULL;
下面是我的代码,只是通过了leetcode,但是还有很多改进的地方,后面再好好学习学习别人的算法。
struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) { int La(0),Lb(0); ListNode *p = headA; while (p!=NULL) //获取A的长度 { La++; p = p->next; } ListNode *q = headB; while (q!=NULL) //获取B的长度 { Lb++; q = q->next; } ListNode *pA = headA; ListNode *pB = headB; if (La >= Lb) //判断A和B的长度,让长的链表先行几步 { int diff = La - Lb; while (diff>0) { pA = pA->next; diff--; } } else { int diff = Lb - La; while (diff>0) { pB = pB->next; diff--; } } while (pA!=NULL && pB!=NULL) //判断是否存在交叉结点,存在就返回,否则返回NULL { if (pA == pB) return pA; else { pA = pA->next; pB = pB->next; } } return NULL; }