力扣 160. 相交链表、面试题 02.07. 链表相交

本题是求两个链表交点节点的指针。关键点在于链表相交的点并不是只是值相同的点,还是指针指向地址相同的点。

时间复杂度:O(n),空间复杂度:O(1)

思路:

  1. 求出两个链表的长度,并求出两个链表长度的差值,然后让curA移动到链表A,B末尾对齐的curB的位置,如下图。
  2. 比较curA和curB是否相同,如果不相同,同时向后移动curA和curB,如果遇到curA == curB,则找到交点。注意:链表相交的点并不是只是值相同的点,还是指针指向地址相同的点。
  3. 如果循环结束还未找到交点,则返回空指针。

力扣 160. 相交链表、面试题 02.07. 链表相交_第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) {
        ListNode* curA = headA;
        ListNode* curB = headB;
        int lenA = 0, lenB = 0;
        while (curA != NULL) { // 求链表A的长度
            curA = curA->next;
            lenA++;
        }
        while (curB != NULL) { // 求链表B的长度
            curB = curB->next;
            lenB++;
        }
        curA = headA;
        curB = headB;
        // 让curA为最长链表的头,lenA为其长度
        if (lenB > lenA) {
            swap (lenA, lenB);
            swap (curA, curB);
        }
        // 求长度差
        int gap = lenA - lenB;
        // 让curA和curB在同一起点上(末尾位置对齐)
        while (gap--) {
            curA = curA->next;
        }
        // 遍历curA和curB,遇到相同则直接返回
        while (curA != NULL) {
            if (curA == curB) { // 链表相交的点并不是只是值相同的点,还是指针指向地址相同的点
                return curA;
            }
            curA = curA->next;
            curB = curB->next;
        }
        return NULL;
    }
};

你可能感兴趣的:(LeetCode,Algorithms,链表,leetcode,数据结构,c++,算法)