当前位置:  首页>> 技术小册>> 数据结构与算法(中)

题目描述

输入两个链表,找出它们的第一个公共结点。

样例

  1. 给出两个链表如下所示:
  2. A a1 a2
  3. c1 c2 c3
  4. B: b1 b2 b3
  5. 输出第一个公共节点c1

解法

先遍历两链表,求出两链表的长度,再求长度差 |n1 - n2|

较长的链表先走 |n1 - n2| 步,之后两链表再同时走,首次相遇时的节点即为两链表的第一个公共节点。

  1. /**
  2. * @author bingo
  3. * @since 2018/12/8
  4. */
  5. /**
  6. * Definition for singly-linked list.
  7. * public class ListNode {
  8. * int val;
  9. * ListNode next;
  10. * ListNode(int x) {
  11. * val = x;
  12. * next = null;
  13. * }
  14. * }
  15. */
  16. class Solution {
  17. /**
  18. * 求两链表第一个公共节点
  19. *
  20. * @param headA 链表A
  21. * @param headB 链表B
  22. * @return 第一个公共节点
  23. */
  24. public ListNode findFirstCommonNode(ListNode headA, ListNode headB) {
  25. if (headA == null || headB == null) {
  26. return null;
  27. }
  28. int n1 = len(headA), n2 = len(headB);
  29. ListNode p1 = headA, p2 = headB;
  30. if (n1 > n2) {
  31. for (int i = 0; i < n1 - n2; ++i) {
  32. p1 = p1.next;
  33. }
  34. } else if (n1 < n2) {
  35. for (int i = 0; i < n2 - n1; ++i) {
  36. p2 = p2.next;
  37. }
  38. }
  39. while (p1 != p2 && p1 != null && p2 != null) {
  40. p1 = p1.next;
  41. p2 = p2.next;
  42. }
  43. return (p1 == null || p2 == null) ? null : p1;
  44. }
  45. private int len(ListNode head) {
  46. int n = 0;
  47. ListNode cur = head;
  48. while (cur != null) {
  49. ++n;
  50. cur = cur.next;
  51. }
  52. return n;
  53. }
  54. }

测试用例

  1. 功能测试(输入的两个链表有公共节点;第一个公共节点在链表的中间,第一个公共节点在链表的末尾,第一个公共节点是链表的头节点;输入的两个链表没有公共节点);
  2. 特殊输入测试(输入的链表头节点是空指针)。

该分类下的相关小册推荐: