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.
Credits:
Special thanks to for adding this problem and creating all test cases.
这道题除了阅读题目的困难较大之外, 其他的都还好。非常好做的一道题目。
代码如下:
//* 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) { if (headA == NULL || headB == NULL) return NULL; int lengtha=1, lengthb=1; ListNode *cora = headA, *corb = headB; while (cora->next != NULL) { cora = cora->next; lengtha++; } while (corb->next != NULL) { corb = corb->next; lengthb++; } if (cora->val != corb->val) return NULL; int dif = lengtha - lengthb; cora = headA, corb = headB; if (dif >= 0) { while (dif) { dif--; cora = cora->next; } } else
{ while (dif) { dif++; corb = corb->next; } } while (cora != NULL) { if (cora == corb) return cora; else { cora = cora->next; corb = corb->next; } } }};