160 相交链表

160 相交链表_第1张图片
解题思路:
\qquad 若两个链表a, b相交,则它们之间的区别就仅在于相交节点之前的部分(其实任意两个链表最终都会相交,最坏相交于NULL节点)。一开始的思路:
\qquad\qquad\qquad 1、找到两个链表较长的那个;
\qquad\qquad\qquad 2、找到两个链表的长度之差;
\qquad\qquad\qquad 3、较长的链表经过差值处理后,遍历两链表检查是否存在相交点。

\qquad 这个思路虽然可行,但略显繁琐。对于不同的情况需要分类讨论,因而导致代码写起来非常复杂。不过,无论是a长,还是b长,a+bb+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;
    }
};

你可能感兴趣的:(热题100,链表,链表,数据结构,leetcode,c++)