【代码随想录 | Leetcode | 第七天】链表 | 链表相交 | 环形链表 II
发布人:shili8
发布时间:2025-01-21 12:18
阅读次数:0
**第七天:链表 | 链表相交 | 环形链表 II**
在前几天的文章中,我们已经学习了如何使用快慢指针来解决一些链表问题,如寻找链表的中点、判断链表是否有环等。今天我们将继续讨论链表相交的问题,特别是环形链表 II 的问题。
**环形链表 II**
环形链表 II 是一个经典的链表问题,它要求我们找到两个给定链表的第一个相交结点。如果这两个链表没有相交,则返回 null。这个问题的难度在于,我们需要考虑到链表可能有环的情况。
**示例1**
输入:listA = [4,1,8,4,5], listB = [1,8,4,5]
输出:return the node with value4**示例2**
输入:listA = [2,6,3,4], listB = [1,5]
输出:return null**解决方案**
为了解决这个问题,我们可以使用两个快慢指针来分别遍历两个链表。我们先将两个链表的长度相加,然后计算出两个链表中快指针应该走的步数。这样我们就可以保证两个链表的快指针在同一时间点上。
# Definition for singly-linked list. class ListNode: def __init__(self, x): self.val = x self.next = Nonedef getIntersectionNode(headA, headB): # Calculate the length of two lists lenA, lenB =0,0 tempA, tempB = headA, headB while tempA: lenA +=1 tempA = tempA.next while tempB: lenB +=1 tempB = tempB.next # Move the longer list's pointer to the end if lenA > lenB: for _ in range(lenA - lenB): headA = headA.next else: for _ in range(lenB - lenA): headB = headB.next # Traverse both lists together while headA and headB: if headA == headB: return headA headA = headA.next headB = headB.next return None
**代码注释**
* `getIntersectionNode` 函数负责找到两个链表的第一个相交结点。
* 首先,我们计算出两个链表的长度,然后将快指针移动到较长链表的末尾。
* 然后,我们一起遍历两个链表,直到找到第一个相交结点或确定这两个链表没有相交。
**测试**
我们可以使用以下测试用例来验证我们的函数是否正确:
# Test case1listA = ListNode(4) listA.next = ListNode(1) listA.next.next = ListNode(8) listA.next.next.next = ListNode(4) listA.next.next.next.next = ListNode(5) listB = ListNode(1) listB.next = ListNode(8) listB.next.next = ListNode(4) listB.next.next.next = ListNode(5) print(getIntersectionNode(listA, listB).val) # Output:4# Test case2listA = ListNode(2) listA.next = ListNode(6) listA.next.next = ListNode(3) listA.next.next.next = ListNode(4) listB = ListNode(1) listB.next = ListNode(5) print(getIntersectionNode(listA, listB)) # Output: None
**总结**
在本文中,我们学习了如何使用快慢指针来解决环形链表 II 的问题。我们首先计算出两个链表的长度,然后将快指针移动到较长链表的末尾。接着,我们一起遍历两个链表,直到找到第一个相交结点或确定这两个链表没有相交。最后,我们使用测试用例来验证我们的函数是否正确。