160-相交链表

题目

160. 相交链表 - 力扣(LeetCode) (leetcode-cn.com)

思路

hash表

我们将一个链表中的所有结点加入到一个hash表中,遍历第二个链表检查其中结点是否在hash表中,找到的第一个在hash表中的结点就是两个链表的交叉点。

裁剪和比较

我们遍历两个链表分别求出其长度,然后计算出长度差h。接着,我们使用两个指针分别指向短链表的头部结点以及长链表的第h个结点。之后,同步一同两个指针,如果指向同一个结点则为两个链表相交的结点。

纯双指针

使用两个指针a,b分别指向两个链表的头部headA, headB,并同步移动指针。当a == b时,返回a,否则当a == nullptr时,重新设置a = headA, b同理。

代码

/**
 * 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* a = headA;
        ListNode* b = headB;

        if (a == nullptr || b == nullptr) {
            return nullptr;
        }

        while(a != b) {
            a = (a == nullptr)? headA : a->next;
            b = (b == nullptr)? headB : b->next;
        }
        return a;
    }
};
上一篇:LeetCode-链表-206. 反转链表


下一篇:c++类的构造函数不显式声明会自动生成吗