LongDz 的数字文墨提案

160. 相交链表

3 min

题目

160. 相交链表 简单

解法:双指针

思路

双指针同步遍历,通过长度差消除距离差。

该方法正确性在于:若两链表相交,设长度差为d,让长链表指针先移动d步后,两指针剩余遍历距离相同,同步移动时必在交点相遇;若不相交,最终将同时到达null。

  • Step 1: 分别计算链表A和B的长度
  • Step 2: 将较长链表的头指针向后移动长度差步
  • Step 3: 双指针同步遍历,直到相遇或同时到达末尾

复杂度

  • 时间复杂度: O(m+n)O(m + n),其中m、n为两链表长度,主要耗时在两次长度计算和同步遍历
  • 空间复杂度: O(1)O(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) {
        int lenA = 0;
        int lenB = 0;
        for (ListNode* p = headA; p != NULL; p = p->next) {
            lenA++;
        }
        for (ListNode* p = headB; p != NULL; p = p->next) {
            lenB++;
        }
        if (lenA > lenB) {
            for (int i = 0; i < lenA - lenB; i++) {
                headA = headA->next;
            }
        } else {
            for (int i = 0; i < lenB - lenA; i++) {
/**
 * 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) {
        int lenA = 0;
        int lenB = 0;
        for (ListNode* p = headA; p != NULL; p = p->next) {
            lenA++;
        }
        for (ListNode* p = headB; p != NULL; p = p->next) {
            lenB++;
        }
        if (lenA > lenB) {
            for (int i = 0; i < lenA - lenB; i++) {
                headA = headA->next;
            }
        } else {
            for (int i = 0; i < lenB - lenA; i++) {
                headB = headB->next;
            }
        }
        while (headA != headB) {
            headA = headA->next;
            headB = headB->next;
        }
        return headA;
    }
};