返回

LeetCode 160:相交链表

前端

前言

踏入前端世界的我们,经常被后端工程师对算法如痴如醉的热情所感染。算法,似乎对我们来说是一个遥不可及的领域。然而,作为程序员,算法能力至关重要。在开发过程中,我们将实际问题转换成计算机可识别的指令,这正是算法的魅力所在。

LeetCode 160:相交链表

题目

给你两个单链表 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,则返回 null

解题思路

  1. 哈希表法

    • 使用哈希表记录链表 headA 的每个节点。
    • 遍历链表 headB ,如果某个节点已经在哈希表中,则说明两个链表相交,返回该节点。
  2. 双指针法

    • 设置两个指针,分别指向链表 headA 和 headB 的头部。
    • 同时向后移动两个指针,直到它们都到达链表的末尾。
    • 如果两个指针都到达链表的末尾,则说明两个链表没有交点,返回 null
    • 否则,将指针 headA 指向链表 headB 的头部,将指针 headB 指向链表 headA 的头部。
    • 继续同时向后移动两个指针,直到它们相遇,返回相遇的节点。

示例代码

/**
 * 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) {
        // 哈希表法
        unordered_set<ListNode *> visited;
        ListNode *temp = headA;
        while (temp != NULL) {
            visited.insert(temp);
            temp = temp->next;
        }
        temp = headB;
        while (temp != NULL) {
            if (visited.find(temp) != visited.end()) {
                return temp;
            }
            temp = temp->next;
        }
        return NULL;

        // 双指针法
        ListNode *p1 = headA;
        ListNode *p2 = headB;
        while (p1 != p2) {
            p1 = p1 == NULL ? headB : p1->next;
            p2 = p2 == NULL ? headA : p2->next;
        }
        return p1;
    }
};

结语

算法作为程序员必备的能力,在前端开发中也不容忽视。希望这篇文章能帮助你理解 LeetCode 160:相交链表的解决方案,并启发你进一步探索算法世界。算法的魅力无穷,坚持学习,终会成为一名优秀的程序员!