题目
输入两个链表,找出它们的第一个公共结点。
当不存在公共节点时,返回空节点。
样例
给出两个链表如下所示:
A: a1 → a2
↘
c1 → c2 → c3
↗
B: b1 → b2 → b3
输出第一个公共节点c1
解法:模拟
先确定两个链表的长度,然后让长的链表先走一段,直到两个链表剩余长度相等
这时两个链表同时开始走,直到遇到公共结点
时间复杂度O(n),空间复杂度O(n)
/*** 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) {int lena = 0, lenb = 0;auto pa = headA, pb = headB;while (pa) {pa = pa->next;lena++;}while (pb) {pb = pb->next;lenb++;}pa = headA, pb = headB;int d = lena - lenb;if (d > 0) {while (d--)pa = pa->next;}else {d = -d;while (d--)pb = pb->next;}while (pa && pb && pa != pb) {pa = pa->next;pb = pb->next;}return pa;}};
