相交链表[LeetCode-160]

403 阅读1分钟

题目描述

思路分析

见代码注释

代码实现

/**
 * 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;
    }
};