题目描述:
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.
- If the two linked lists have no intersection at all, return
本题要我们找出两个链表中节点相同的一部分,并返回最初的节点。
Notes:
没有相同的部分返回null。
函数返回时要保留链表原来的结构。
可以认为两个链表都没有围成环。
代码应该以O(n)时间和使用O(1)空间运行。
解题思路:
本题的难点是如何只使用O(n)时间就可以检索出答案。
相同部分很可能在两个链表的不同位置。但无论如何,相同部分肯定都是在两个链表的最后一部分,而且长度相同。
所以,可以将两个链表“拼接”在一起。这样,相同部分在两个链表的位置就相同了,只要遍历一遍链表就可以找到。
代码:
/** * 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||!headB) return NULL; ListNode *curA=headA; ListNode *curB=headB; while(curA&&curB){ if (curA == curB) break; curA = curA->next; curB = curB->next; if (curA == curB) break; if (!curA) curA = headB; if (!curB) curB = headA; } return curA; } };