题目:
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.
(1)首先遍历两个链表得到他们的长度,就能知道哪个链表比较长,以及长的链表比短的链表多几个节点。
(2)在第二次遍历的时候,在较长的链表上先走若干步,接着同时在两个链表上遍历,找到第一个相同的结点就是他们的第一个公共结点。
/**
* 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) {
if(headA==NULL or headB==NULL)return NULL;
int length1=getLength(headA), length2=getLength(headB);
int dist = abs(length1-length2);
ListNode *Long_head = headB, *Short_head = headA;
if(length1>length2)
{
Long_head = headA;
Short_head = headB;
}
while(dist>0)
{
Long_head = Long_head->next;
dist--;
}
while(Long_head!=NULL and Short_head!=NULL)
{
if(Long_head==Short_head)
return Short_head;
Long_head = Long_head->next;
Short_head = Short_head->next;
}
return NULL;
}
int getLength(ListNode *head)
{
if(head==NULL)return 0;
int count = 1;
while(head->next!=NULL)
{
count++;
head = head->next;
}
return count;
}
};