题目地址:
https://leetcode.com/problems/intersection-of-two-linked-lists/
给定两个链表,要求返回这两个链表相交处的节点。如果不相交则返回null。
可以先算出两个链表的长度,然后移动长的那个链表的表头与短的那个对齐,接着两个指针同时向后走即可。代码如下:
class Solution {
public:
ListNode *getIntersectionNode(ListNode *l1, ListNode *l2) {
int n1 = 0, n2 = 0;
for (ListNode *p = l1; p; p = p->next) n1++;
for (ListNode *p = l2; p; p = p->next) n2++;
if (n1 < n2) {
swap(l1, l2);
swap(n1, n2);
}
while (n1 > n2) {
l1 = l1->next;
n1--;
}
while (l1 != l2) l1 = l1->next, l2 = l2->next;
return l1;
}
};
时间复杂度 O ( m + n ) O(m+n) O(m+n),空间 O ( 1 ) O(1) O(1)。