网站优化

网站优化

Products

当前位置:首页 > 网站优化 >

读后能轻松解决相交链表节点问题,提升编程技能!

GG网络技术分享 2025-11-10 11:53 4


链表交叉问题是一个常见的算法和数据结构问题, 通常分为以下几种情况:

1. 判断链表是不是存在环

判断链表是不是存在环,Neng通过迅速磨蹭指针法来解决。具体步骤如下:

  • 初始化两个指针,slowfast,它们dou指向链表的头节点。
  • 逐步移动两个指针,slow 每移动一步,fast 每移动两步。
  • Ru果链表中存在环,那么 slowfast 到头来会相遇。

2. 找到环的入口点

找到环的入口点, Neng利用以下步骤:

  • 在第一次相遇后将一个指针固定在相遇点,将另一个指针移回到链表头。
  • 一边移动两个指针,每步一个节点,当它们 相遇时相遇点即为环的入口点。

3. 计算环的节点数

计算环的节点数, Neng采用以下方法:

  • 将一个指针固定在环的入口点,另一个指针接着来沿着环移动,直到它回到入口点。
  • 每移动一步,计数器加一,直到回到入口点,此时计数器的值即为环的节点数。

4. 判断两个链表是不是相交

判断两个链表是不是相交, 有以下几种方法:

  • 哈希表法遍历其中一个链表,将全部节点的地址存储到哈希表中,然后遍历另一个链表,检查其节点是不是在哈希表中。
  • 双指针法先计算两个链表的长远度, 然后让较长远的链表先走 |l1 - l2| 步,使得两个链表的起点对齐,然后一边遍历两个链表,直到找到相同的节点,即为相交节点。

5. 找到相交节点

找到相交节点, Neng采用以下方法:

  • 双指针法如前所述,通过调整链表长远度使两个链表的起点对齐,然后一边遍历两个链表,找到第一个相同的节点即为相交节点。

代码示例

cpp struct ListNode { int val; ListNode *next; ListNode : val, next {} };

ListNode* getIntersectionNode { int lenA = 0, lenB = 0; ListNode *p1 = headA, *p2 = headB;

while  {
    lenA++;
    p1 = p1->next;
}
while  {
    lenB++;
    p2 = p2->next;
}
p1 = headA;
p2 = headB;
int diff = abs;
if  {
    for  {
        p1 = p1->next;
    }
} else {
    for  {
        p2 = p2->next;
    }
}
while  {
    if  {
        return p1;
    }
    p1 = p1->next;
    p2 = p2->next;
}
return NULL;

}

标签:

提交需求或反馈

Demand feedback