160. 相交链表

106 阅读2分钟

160. 相交链表

LeetCode


描述:

image-20220411102958769

思路:

  • 只看示意图, 可以一下理解题意, 需要注意到的是, 所谓的相交, 并非只是单单仅仅指链表的数据域里面的值相等(我一开始就打算暴力遍历然后一个一个比较值).
  • 相交是指, 两个链表的相交点后的元素完全相同, 也即找到那个相交点(两个指针指向同一个元素的位置)
  • 想通了上面一点题目就可以写出来.
    • 可以直接同时遍历两个链表, 看当前遍历的两个链表元素的指针域是否指向同一个地址, 如果是的话, 即为相交点.(即双指针法)
    • 这其中的难点是, 当两个链表长度相等的时候, 可以直接进行遍历, 但是如果不相等, 及一个链表长一个链表短, 如果都从头开始遍历的话会导致长链表遍历不够. 故有两种解决办法:
      1. 先依次求出两个链表的长度. 若两个链表长度不同, 长链表先遍历至和短链表相同的长度, 继续进行遍历.
      2. 遍历到结尾后, 交换, 类似等待的机制, 使两个链表遍历的位置同步.

代码:

  1. 遍历到结尾交换

    /*
     * @lc app=leetcode.cn id=160 lang=cpp
     *
     * [160] 相交链表
     */
    
    // @lc code=start
    /**
     * 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 == nullptr || headB == nullptr)
            {
                return nullptr;
            }
            
            ListNode *curA = headA;
            ListNode *curB = headB;
    
            while (curA != curB)
            {
                curA = curA == nullptr ? headB : curA->next;
                curB = curB == nullptr ? headA : curB->next;
            }
    
            return curA;
        }
    };
    
  2. 求两链表长度

    /*
     * @lc app=leetcode.cn id=160 lang=cpp
     *
     * [160] 相交链表
     */
    
    // @lc code=start
    /**
     * 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, lenB = 0;
            ListNode *curA = headA;
            ListNode *curB = headB;
            while (curA)
            {
                lenA++;
                curA = curA->next;
            }
            while (curB)
            {
                lenB++;
                curB = curB->next;
            }
            curA = headA;
            curB = headB;
            if (lenA > lenB)
            {
                for (int i = 0; i < lenA - lenB; i++)
                {
                    curA = curA->next;
                }
            }
            else
            {
                for (int i = 0; i < lenB - lenA; i++)
                {
                    curB = curB->next;
                }
            }
            while (curA != curB)
            {
                curA = curA->next;
                curB = curB->next;
            }
            return curA;
        }
    };
    

参考:

[1] LeetCode官方题解