链接
https://leetcode-cn.com/problems/intersection-of-two-linked-lists/
耗时
解题:14 min
题解:6 min
题意
编写一个程序,找到两个单链表相交的起始节点。
思路
遍历两个链表,得到它们的长度,将较长的链表头指针向后移动,使得两链表头指针到末尾的长度相同。然后将两个头指针同时向后移动,直到两指针指向的节点相同,返回这个节点;如果不能找到相同的节点则说明两个链表没有交点,返回 null。
时间复杂度: O ( n ) O(n) O(n)
AC代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
int countLen(ListNode *p) {
int len = 0;
while(p != NULL) {
p = p->next;
len++;
}
return len;
}
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
int lenA = countLen(headA);
int lenB = countLen(headB);
int rest = abs(lenA - lenB);
if(lenA >= lenB) {
for(int i = 0; i < rest; ++i) {
headA = headA->next;
}
}
else {
for(int i = 0; i < rest; ++i) {
headB = headB->next;
}
}
while(headA != NULL) {
if(headA == headB) {
return headA;
}
headA = headA->next;
headB = headB->next;
}
return NULL;
}
};