题目:
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.
先判断长度,再让长的先走完长的部分,然后比较。
C++版:
/**
* 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* pA = headA, *pB = headB;
int lA = 0, lB = 0;
while(pA != NULL) {
pA = pA->next;
lA++;
}
while(pB != NULL) {
pB = pB->next;
lB++;
}
if(lA == 0 || lB == 0)
return NULL;
int i = 0;
pA = headA;
pB = headB;
if(lA >= lB) {
while(i < lA - lB) {
pA = pA->next;
i++;
}
} else {
while(i < lB - lA) {
pB = pB->next;
i++;
}
}
while(pA != NULL) {
if(pA == pB)
return pA;
pA = pA->next;
pB = pB->next;
}
return NULL;
}
};
Java版:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
ListNode pA = headA;
ListNode pB = headB;
int lA = 0;
int lB = 0;
while(pA != null) {
pA = pA.next;
lA++;
}
while(pB != null) {
pB = pB.next;
lB++;
}
int i = 0;
pA = headA;
pB = headB;
if(lA >= lB) {
while(i < lA - lB) {
pA = pA.next;
i++;
}
} else {
while(i < lB - lA) {
pB = pB.next;
i++;
}
}
while(pA != null) {
if(pA == pB)
return pA;
pA = pA.next;
pB = pB.next;
}
return null;
}
}
Python版:
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def getIntersectionNode(self, headA, headB):
"""
:type head1, head1: ListNode
:rtype: ListNode
"""
probA, probB = headA, headB
lA, lB = 0, 0
while probA != None:
probA = probA.next
lA += 1
while probB != None:
probB = probB.next
lB += 1
if lA == 0 or lB == 0:
return None
probA, probB = headA, headB
i = 0
if lA >= lB:
while i < lA - lB:
probA = probA.next
i += 1
else:
while i < lB - lA:
probB = probB.next
i += 1
while probA != None:
if probA == probB:
return probA
probA = probA.next
probB = probB.next
return None