输入两个链表,找出它们的第一个公共结点。
当不存在公共节点时,返回空节点。
数据范围
链表长度 [1,2000]
。
保证两个链表不完全相同,即两链表的头结点不相同。
样例
给出两个链表如下所示:
A: a1 → a2
↘
c1 → c2 → c3
↗
B: b1 → b2 → b3
输出第一个公共节点c1
思想:通过双指针遍历两个链表,先同时遍历至链表末尾。若其中一个链表遍历结束,则将其指针重新指向另一链表头,并继续遍历。这样,两个指针最终相遇的节点即为第一个公共节点(因为走过的长度相等),同样适用于不相交的两个链表,因为在第二次遍历时会同时走到链表的结尾,同时为空。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *findFirstCommonNode(ListNode *headA, ListNode *headB) {
auto p = headA, q = headB;
while(p && q) {
p = p->next;
q = q->next;
}
if(!p) {
p = headB;
while(q){
q = q->next;
p = p->next;
}
q = headA;
while(q != p) {
q = q->next;
p = p->next;
}
return p;
} else {
q = headA;
while(p){
q = q->next;
p = p->next;
}
p = headB;
while(q != p) {
q = q->next;
p = p->next;
}
return p;
}
}
};
然后看到大佬写的简洁版本,嗯,差距就出来了…加油
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *findFirstCommonNode(ListNode *headA, ListNode *headB) {
auto p = headA, q = headB;
while(p != q) {
if(p) p = p->next;
else p = headB;
if(q) q = q->next;
else q = headA;
}
return p;
}
};
555 菜要多练qwq