编写一个程序,找到两个单链表相交的起始节点。
题目来源:https://leetcode-cn.com/problems/intersection-of-two-linked-lists
注意:
如果两个链表没有交点,返回 null.
在返回结果后,两个链表仍须保持原有的结构。
可假定整个链表结构中没有循环。
程序尽量满足 O(n) 时间复杂度,且仅用 O(1) 内存。
题目分析:
- 链表相交的特点:从某一个结点开始,两条链表合并为同一条链表,成一个Y的形状。
- 注意找相交结点不是查找结点val值相等的结点,而是整个结点,包括指针部分都相等的结点。
步骤:
- 分别得到两条链表的长度
- 长度长的链表提前让指针向后走,走到与短的链表长度相等为止
- 两条链表的指针同时向后走,并且边走边比较指针是否相等
/**
* 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* p1=headA;
ListNode* p2=headB;
int len1=getlen(headA);
int len2=getlen(headB);
while(len1 != len2){
if(len1>len2)
{
p1=p1->next;
len1--;
}
if(len1<len2)
{
p2=p2->next;
len2--;
}
}
while( p1 != p2)
{
p1=p1->next;
p2=p2->next;
}
return p1;
}
int getlen(ListNode* head)
{
int count=0;
while(head)
{
count++;
head=head->next;
}
return count;
}
};