★ 题目
https://leetcode.com/problems/intersection-of-two-linked-lists/
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.
★ 代码
42 / 42 test cases passed.
Runtime: 20 ms
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
#define rint register int
typedef struct ListNode ListNode;
int getSize(ListNode* head) {
rint len = 0;
ListNode* curr = head;
while (curr != NULL) {
len++;
curr = curr->next;
}
return len;
}
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
if (headA == NULL || headB == NULL) {
return NULL;
}
int lenA = getSize(headA);
int lenB = getSize(headB);
int diff = (lenA > lenB)?(lenA - lenB):(lenB - lenA);
ListNode* curr = NULL;// 指向较短的链表
ListNode* currLong = NULL;// 指向较长的链表
if (lenA > lenB) {
currLong = headA;
curr = headB;
} else {
currLong = headB;
curr = headA;
}
rint i = 0;
while (i < diff) {
currLong = currLong->next;
i++;
}
bool found = false;
while (curr != NULL && currLong != NULL) {
if (currLong->val == curr->val) {
found = true;
break;
}
currLong = currLong->next;
curr = curr->next;
}
return found?curr:NULL;
}