原题目,在不改变两条单项链表的情况下,判断相交点.
据说是字节跳动的面试Easy题.
class Node
{
public:
int data;
Node* next;
Node(int data, Node* nextP = nullptr) :data(data), next(nextP)
{}
};
先写一个节点类
Node* sameAddress{ new Node{666,new Node{4,new Node{5}}} };
Node No_1{ 1,new Node{2,new Node{3,new Node{555,sameAddress}}} };
Node No_2{ 11,new Node{22,new Node{33,new Node{489,new Node{449,new Node{1556,sameAddress}}}}} };
接着手搓一两条相交的链表
可以通过快慢指针的差速来解决.
下面附解题源码.
tmp1和tmp2各自对应两条链表的头节点
while(p1->next!=p2)
{
if (p1->next)
p1 = p1->next;
else
p1 = tmp1;
if (p2->next->next)
p2 = p2->next->next;
else
p2 = tmp2;
}
可读性高的版本
while (p1->next != p2)
{
p1->next ? p1 = p1->next : p1 = tmp1;
p2->next->next ? p2 = p2->next->next : tmp2;
}
使用三目运算符简洁版本
while (p1->next != p2)
(p2->next->next ? p2 = p2->next->next : tmp2) && (p1->next ? p1 = p1->next : p1 = tmp1) ;
使用三目运算符加逻辑运算的超简洁版本