问题描述
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
- You may assume there are no cycles anywhere in the entire
- Your code should preferably run in O(n) time and
use only O(1) memory.
Credits:
Special thanks to @stellari for adding this problem and creating all test cases.
思路分析
检测两个链表是否有重合的结点,如果有的话就返回第一个相交的点。
若两链表任一为空则返回null;开始遍历两条链表,因为两条链表长度可能不同,因此我们可设置两条链表结束之后链至另一条的头上,这样两条链表如果有重合的地方就可以重合在一起了(很巧妙,一开始没有想到)
/**
* 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) {
ListNode *p1 = headA;
ListNode *p2 = headB;
if(p1 == NULL || p2 == NULL)
return NULL;
while(p1 != NULL && p2 != NULL && p1 != p2){
p1 = p1->next;
p2 = p2->next;
if(p1 == p2)
return p1;
if(p1 == NULL)
p1 = headB;
if(p2 == NULL)
p2 = headA;
}
return p1;
}
};
时间复杂度:O(m + n)
反思
当判断完头节点之后就可以直接next node了,因为头节点相同的话两条链表就是相同的了。然后在判断是否相同,从这开始返回任意指针P1 || P2都可以了。(null 或重合点)