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.
解法一:
先比较两个linked list的长度,然后将他们长度对齐,然后一一比较相同位置的node。
/**
* 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* ha = headA, *hb = headB;
int m =0, n= 0;
while(ha){
m++;
ha = ha->next;
}
while(hb){
n++;
hb = hb->next;
}
ha = headA; hb = headB;
if (m>n){
for(int i=0; i<m-n;i++) ha= ha->next;
}
else{
for(int i=0; i<n-m;i++) hb= hb->next;
}
while(ha){
if(ha==hb) return ha;
else{
ha = ha->next;
hb = hb->next;
}
}
return ha;
}
};
大神的思路啊:实际上相当于让两个人以相同的速度在两个linked list上移动,如果移到终点则从另外一个linked list的head出发继续移动。如果两个list有相交,两个人必然会在那个node上碰面。或者两个人分别走完两个list,并在list的尾部碰面。代码简洁。
/**
* 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* ha = headA, *hb = headB;
while(ha!=hb){
ha = ha?ha->next:headB;
hb = hb?hb->next:headA;
}
return ha;
}
};