题目: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.
题目解答:
判断两个链表是否有交集,并返回相交的第一个节点,若不想交,返回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) {
int lenA = getListLen(headA);
int lenB = getListLen(headB);
if((lenA == 0) || (lenB == 0))
return NULL;
ListNode *p = headA;
ListNode *q = headB;
if(lenA > lenB)
{
int i = lenA - lenB;
while(i != 0)
{
i--;
p = p -> next;
}
}
else
{
int i = lenB - lenA;
while(i != 0)
{
i--;
q = q -> next;
}
}
while((p != NULL) && (q != NULL) && (p != q) )
{
p = p -> next;
q = q -> next;
}
if(p == q)
return p;
else
return NULL;
}
int getListLen(ListNode *head)
{
int len = 0;
ListNode *p = head;
while(p != NULL)
{
len++;
p = p-> next;
}
return len;
}
};