Lei宝啊:个人主页
愿美好与我们不期而遇
题目:
描述
给你两个单链表的头节点 headA和
headB
,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回null
接口
struct ListNode *getIntersectionNode
(struct ListNode *headA, struct ListNode *headB) { }
示例
思路
走差距步,比地址不比值
可以想象的到,如果长的和短的一起走,走到相等的值不就是相同节点吗?
但是也可能会出现这种情况:
那么这样的话,比值就不可行了,但是如果节点相交,他们的地址一定是相同的 。
也由此,我们可以通过最后的一个节点判断他们是否相交,如果他们最后一个节点地址相同,则相交,我们去找相交节点,否则返回NULL。
实现代码
int lenA = 1;int lenB = 1;struct ListNode* curA = headA;while(curA->next){lenA++;curA = curA->next;}struct ListNode* curB = headB;while(curB->next){lenB++;curB = curB->next;}if(curA != curB)return NULL;struct ListNode* fast = headA;struct ListNode* slow = headB;if(lenA < lenB){fast = headB;slow = headA;}int k = abs(lenA-lenB);while(k--){fast = fast->next;}while(fast != slow){if(fast == slow)return fast;fast = fast->next;slow = slow->next;}return fast;