编写一个程序,找到两个单链表相交的起始节点。
思路:考虑两个简单无环的单向链表,若相交,从某个节点之后节点相同,一定呈Y字形相交。
方法一、借用栈结构,使用两个栈,分别加入A, B链表的节点;然后对栈遍历,若栈顶元素相等,则一定相交,记录此时的节点,元素出栈,一直到栈顶元素不相等,此时之前记录的节点就是相交节点。
代码:
/**
* 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 *pa = headA, *pb=headB;
stack <ListNode*> sa; //链表 A 入栈
while (pa)
{
sa.push(pa);
pa = pa->next;
}
stack <ListNode*> sb; //链表 B 入栈
while (pb)
{
sb.push(pb);
pb = pb->next;
}
ListNode * intersect = NULL, ta, tb;
while (!sa.empty()&&!sb.empty()) 比较栈顶元素找交点
{
if (sa.top()==sb.top()) //栈顶元素相等
{
intersect = sa.top();
sa.pop();
sb.pop();
}
else
break;
}
return intersect;
}
};
方法二、若对空间复杂度做出限制,我们就不能使用栈了。
假设长链表长度为x,短链表长度为y,长链表先走x-y步,然后两个链表一起走,第一个相同的节点就是交点。
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
int la = 0, lb = 0;
//计算链表A的长度
ListNode* t = headA;
while (t)
{
la++;
t = t->next;
}
//计算链表B的长度
t = headB;
while (t)
{
lb++;
t = t->next;
}
//长链表与短链表尾部对齐
if (la<lb)
for (int i=0; i<(lb-la); ++i)
headB = headB->next;
else
for (int i=0; i<(la-lb); ++i)
headA = headA->next;
while (headB)
{
if (headB == headA)
return headA;
headA = headA->next;
headB = headB->next;
}
return NULL;
}
};
题目:https://leetcode-cn.com/problems/intersection-of-two-linked-lists/