LeetCode Hot100 第 160 题:相交链表(C 语言超小白完整版)

📅 2026/7/3 11:24:53
LeetCode Hot100 第 160 题:相交链表(C 语言超小白完整版)
问题描述题目要求找到两个单链表相交的起始节点。如果两个链表没有交点返回NULL。假设链表没有环且必须保持原始结构。双指针相遇法思路双指针相遇法的核心思想是通过让两个指针分别遍历两个链表最终在相交点相遇。具体步骤如下初始化两个指针pA和pB分别指向链表headA和headB的头节点。让pA和pB同时向前移动每次移动一步。如果pA到达链表末尾NULL则将其重定向到headB如果pB到达链表末尾NULL则将其重定向到headA。当pA和pB相遇时即为相交的起始节点。如果两个链表不相交最终pA和pB会同时到达NULL。代码实现// 链表节点定义题目自带必须写 struct ListNode { int val; struct ListNode *next; }; // 函数输入两个链表头返回相交节点 struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) { // 1. 定义两个指针分别指向两条链表起点 struct ListNode *pA headA; struct ListNode *pB headB; // 2. 循环条件两个指针不相等就持续移动 while (pA ! pB) { // pA没到末尾向后走一步到末尾就换到B链表开头 if (pA ! NULL) { pA pA-next; } else { pA headB; } // pB没到末尾向后走一步到末尾就换到A链表开头 if (pB ! NULL) { pB pB-next; } else { pB headA; } } // 循环退出两者相等要么交点要么NULL return pA; }不适合采用递归法。复杂度分析时间复杂度为 O(m n)其中 m 和 n 分别是链表headA和headB的长度。空间复杂度为 O(1)仅使用了两个指针变量。关键点双指针相遇法通过让两个指针分别遍历两个链表确保它们最终走过相同的路径长度从而在相交点相遇。这种方法避免了额外的空间消耗同时保证了高效性。