解题思路:
\qquad
若两个链表a, b
相交,则它们之间的区别就仅在于相交节点之前的部分(其实任意两个链表最终都会相交,最坏相交于NULL节点)。一开始的思路:
\qquad\qquad\qquad
1、找到两个链表较长的那个;
\qquad\qquad\qquad
2、找到两个链表的长度之差;
\qquad\qquad\qquad
3、较长的链表经过差值处理后,遍历两链表检查是否存在相交点。
\qquad
这个思路虽然可行,但略显繁琐。对于不同的情况需要分类讨论,因而导致代码写起来非常复杂。不过,无论是a
长,还是b
长,a+b
和 b+a
总是一样长。
优化思路:
\qquad
同时遍历a, b
两个链表,直到它们遇到相交节点(node_a == node_b
),或NULL
。
\qquad
如果在相交前,到达了链表末尾,则下一节点将是另一条链表的起始节点。
\qquad
由于 a + b = b + a
,若两链表不相交,两指针最终一定会同时到达NULL
,若相交,相交节点到NULL
的距离相等,指针能同时到达。这种交叉遍历的方式,巧妙兼容了a
长还是b
长的问题。
优化代码:
\qquad
使用 ( Z ) ? X : Y
句式完成简单的if{} else{}
替换,进一步简化代码。
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
ListNode * a = headA;
ListNode * b = headB;
while (a != b)
{
a = (a == NULL) ? headB : a->next;
b = (b == NULL) ? headA : b->next;
}
return a;
}
};