题目描述
思路分析
见代码注释
代码实现
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
// 如果有为空的链表,则肯定不相交
if (!headA || !headB) return NULL;
int lena = 0, lenb = 0;
ListNode* baka = headA, *bakb = headB;
// 统计两个链表各自的节点数,之所以不用while(baka),因为这样可以得到最后一个节点
// 通过比较两个链表的最后一个节点,如果不想等,直接可以判定不相交,提升一定效率
while(baka->next) {
lena++;
baka = baka->next;
}
while(bakb->next) {
lenb++;
bakb = bakb->next;
}
if (baka != bakb) return false;
// 要求不能改变原链表节点,这里重置baka 和 bakb
baka = headA; bakb = headB;
// 让长度更长的链表多走一段,以保证两个链表剩下一样的长度
if (lena > lenb) {
for (int i = 0; i < lena - lenb; i++) {
baka = baka->next;
}
} else if (lena < lenb) {
for (int i = 0; i < lenb - lena; i++) {
bakb = bakb->next;
}
}
// 现在剩余长度一致,同时遍历,直到有一样的节点返回该节点
while(baka && bakb) {
if (baka == bakb) {
return baka;
}
baka = baka->next;
bakb = bakb->next;
}
return NULL;
}
};