题目要求
找到两个单链表的交点
- 两单链表不相交,返回NULL;
- 链表无环
- 时间复杂度:O(n) 空间复杂度:O(1)
分析
问题的核心是:如何使指向两个链表的指针达到从后向前对齐。
这里“从后向前对齐”指的是,指向两个链表的指针,距离各自链表最后一个节点的距离(节点数)相等。当两个指针“从后向前对齐”之后,只需要一步步向后移动指针,比较结点值是否相等即可。
- 见到题目,第一想法是用递归,可是递归需要栈,空间复杂度超过O(1),pass。
- 基于遍历的思想
a.分别遍历一次两个链表显然无法达到对齐两指针的目标
b.设置两个指针分别指向两个链表,当指针到达链表尾部时,令其移动到(指向)另一个链表头,继续遍历;遍历过程中,检查结点值是否相等。
注:此方法同样适用于多个链表(大于2)求共同交点问题。
C代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
struct ListNode* p1 = headA;
struct ListNode* p2 = headB;
while(p1 != p2)
{
p1 = p1?p1->next:headB; //此处不能用p1=p1->next?...否则可能造成死循环
p2 = p2?p2->next:headA;
}
return p1;
}