1、题目
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.
2、解答:题目的意思是 找到两个链表的共同起始结点
3、C++代码
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
ListNode *pA = headA,*pB = headB;
int lenA = 0,lenB = 0;
while(pA){
lenA++;
pA = pA->next;
}
while(pB){
lenB++;
pB = pB->next;
}
pA = headA,pB = headB;
if(lenA > lenB){
for(int i =0;i<lenA-lenB;i++)
pA = pA->next;
}else{
for(int i=0;i<lenB-lenA;i++)
pB = pB->next;
}
while(pA){
if(pA == pB)
return pA;
pA = pA->next;
pB = pB->next;
}
return NULL;
}
};
python代码
class Solution(object):
def getIntersectionNode(self, headA, headB):
"""
:type head1, head1: ListNode
:rtype: ListNode
"""
curA,curB = headA,headB
lenA,lenB = 0,0
while curA is not None:
lenA += 1
curA = curA.next
while curB is not None:
lenB += 1
curB = curB.next
curA,curB = headA,headB
if lenA > lenB:
for i in range(lenA-lenB):
curA = curA.next
elif lenB > lenA:
for i in range(lenB-lenA):
curB = curB.next
while curB != curA:
curB = curB.next
curA = curA.next
return curA