题目描述
编写一个程序,找到两个单链表相交的起始节点。
例如,下面的两个链表:
A: a1 → a2 ↘ c1 → c2 → c3 ↗ B: b1 → b2 → b3
在节点 c1 开始相交。
注意:
- 如果两个链表没有交点,返回
null
. - 在返回结果后,两个链表仍须保持原有的结构。
- 可假定整个链表结构中没有循环。
- 程序尽量满足 O(n) 时间复杂度,且仅用 O(1) 内存。
解答
两链表开始相交后,后面的节点完全相同。所以长链表取和短链表等长后面一段,和短链表一起遍历,遇到相等的节点即为相交的节点。
/**
* 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==0||headB==0) return 0;
int lenA = getlen(headA);
int lenB = getlen(headB);
if(lenA>lenB){
for(int i=0;i<lenA-lenB;i++){
headA = headA->next;
}
}
else if(lenA<lenB){
for(int i=0;i<lenB-lenA;i++){
headB = headB->next;
}
}
while(headA&&headB){
if(headA==headB) return headA;
headA = headA->next;
headB = headB->next;
}
return 0;
}
int getlen(ListNode *head){
int cnt = 0;
while(head){
cnt++;
head = head->next;
}
return cnt;
}
};