求两个单链表的第一个公共节点

求两个单链表的第一个公共节点。

分析:
两个链表的第一个公共节点之后的部分相同(完全重合)
1.当两个单链表A、B长度相等时,对两个单链表同时进行遍历,若节点不相等,则指针分别指向下一个节点;当A链表的指针等于B链表的指针时,该节点即为第一个公共节点。
2.当两个单链表A、B长度不相等时,假设B为两个链表中较长的一个,其长度为M,A链表的长度为N,则M>N;则B链表的前M-N个节点的不可能存在公共节点,对其前M-N个节点进行遍历,使其后半部分的长度和A链表的长度想的,其长度为N,此时两个链表长度相等,采用步骤1中的思路进行同时遍历。
时间复杂度为O(M+N),即为O(M);

代码如下:

struct ListNode
{
  int val;
  ListNode* next;
  ListNode(int x):val(x),next(NULL){}
};

class Solution
{
public:
  //求单链表的长度
  int listLength(ListNode* head)
  {
     int n=0;
     while(head)
     {
        n++;
        head=head->next;
     }
     return n;
   }
  //求第一个公共节点
  ListNode* FirstCommonNode(ListNode* headA,ListNode* headB)
  {
    int Alength=listLength(headA);//求A链表的长度
    int Blenght=listLength(headB);//求B链表的长度
    if(Alength>Blength)
    {
       swap(headA,headB);将B置为长链表
       swap(Alength,Blength);
    }
    //将B前Blength-Alength个节点空转
    for(int i=0;i!=Blength-Alength;i++)
    {
       headB=headB->next;
    }
    //两个个指针同时遍历
    while(headA)
    {
       if(headA==headB)
         return headA;//若两个节点相等,则返回该节点
       headA=headA->next;
       headB=headB->next;
    }
    return NULL;
}

发布了22 篇原创文章 · 获赞 1 · 访问量 352

猜你喜欢

转载自blog.csdn.net/weixin_43086349/article/details/104615500