Write a program to find the node at which the intersection of two singly linked lists begins.
For example, the following two linked lists:
A: a1 → a2 ↘ c1 → c2 → c3 ↗ B: b1 → b2 → b3
begin to intersect at node c1.
Notes:
- If the two linked lists have no intersection at all, return
null
. - The linked lists must retain their original structure after the function returns.
- You may assume there are no cycles anywhere in the entire linked structure.
- Your code should preferably run in O(n) time and use only O(1) memory.
- 思路:两个链表在交叉结点之前的节点数不一定一样,但是在遍历完a链表第一次之后,开始遍历b链表,b链表遍历完再遍历a链表,这样它们就会同时到达交叉结点。因为,a链表和b链表的长度之和是一样的,交叉结点后的长度是一样的,所以第二次交叉遍历时,一定是同时到达交叉结点。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution
{
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB)
{
ListNode *p = headA, *q= headB;
while(p!= q)
{
p= p?p->next:headB;
q= q?q->next:headA;
}
return p;
}
};