题目
输入两个链表,找出它们的第一个公共结点。
当不存在公共节点时,返回空节点。
样例
给出两个链表如下所示:
A: a1 → a2

c1 → c2 → c3

B: b1 → b2 → b3
输出第一个公共节点c1

解法:模拟

先确定两个链表的长度,然后让长的链表先走一段,直到两个链表剩余长度相等
这时两个链表同时开始走,直到遇到公共结点
时间复杂度O(n),空间复杂度O(n)

  1. /**
  2. * Definition for singly-linked list.
  3. * struct ListNode {
  4. * int val;
  5. * ListNode *next;
  6. * ListNode(int x) : val(x), next(NULL) {}
  7. * };
  8. */
  9. class Solution {
  10. public:
  11. ListNode *findFirstCommonNode(ListNode *headA, ListNode *headB) {
  12. int lena = 0, lenb = 0;
  13. auto pa = headA, pb = headB;
  14. while (pa) {
  15. pa = pa->next;
  16. lena++;
  17. }
  18. while (pb) {
  19. pb = pb->next;
  20. lenb++;
  21. }
  22. pa = headA, pb = headB;
  23. int d = lena - lenb;
  24. if (d > 0) {
  25. while (d--)
  26. pa = pa->next;
  27. }
  28. else {
  29. d = -d;
  30. while (d--)
  31. pb = pb->next;
  32. }
  33. while (pa && pb && pa != pb) {
  34. pa = pa->next;
  35. pb = pb->next;
  36. }
  37. return pa;
  38. }
  39. };