问题描述

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.

问题分析

首先求出两条链表的长度l1和l2,获取l1和l2的差值gap,然后让长的链表先走gap步,然后再两条链表同时走,如果中间有两个节点地址相同,即所求连接点。

代码

class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        if(headA==0||headB==0) return 0;
		
		ListNode* p = headA;
		ListNode* q = headB;
		
		int l1 = 0;
		int l2 = 0;
		
		while(p) {
			l1++;
			p=p->next;
		}
		while(q) {
			l2++;
			q=q->next;
		}
		int gap = l1 - l2;
		p = (gap>=0?headA:headB);
		q = (gap<0?headA:headB);
		gap = abs(gap);
		while(gap--) {
			p=p->next;
		}
		while(p!=0&&q!=0) {
			if(p==q) return p;
			p = p->next;
			q = q->next;	
		} 
	 	return 0;
    }
};