题目描述
编写一个程序,找到两个单链表相交的起始节点。
题目来源:https://leetcode-cn.com/problems/intersection-of-two-linked-lists
解题思路
- leetcode 链表题目中,链表结构体都是没有头结点的。每次我都会自动构造一个头结点。
- 链表题目其实都不难,画画图基本都能够解出来。
本题目比较难,而且该题目解题思路十分巧妙。
假定存在两个单链表 A, B,寻找相交的起始节点的思路如下:
指定两个指针 p 和 q,分别指向单链表 A 和 单链表 B 中第一个元素,而后依次向后移动。如果 p 到达单链表 A 的末尾,则将 p 重置为单链表 B 中第一个元素;如果 q 到达单链表 B 的末尾,则将 q 重置为单链表 A 中第一个元素。经过一次重置后,一定存在 p == q
,而此时便是相交的起始节点 / NULL 结点。
为什么经过依次重置后,一定存在 p == q
,且此时便是相交的起始节点 / NULL 结点?这里通过图说明一下该结论:
实现代码
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB)
{
ListNode* p = headA,*q = headB;
while(p != q)
{
if(p == NULL)
{
p = headB;
}
else
{
p = p->next;
}
if(q == NULL)
{
q = headA;
}
else
{
q = q->next;
}
}
return p;
}