7.找出两个链表的第一个公共结点

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

题目描述

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


/*

struct ListNode {

int val;

struct ListNode *next;

ListNode(int x) :

  val(x), next(NULL) {

}

};*/

解法一:


/*

关键:找出2个链表的长度,然后让长的先走两个链表的长度差,然后再一起走

(因为2个链表用公共的尾部NULL)

*/

class Solution {

public:

   ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {

       ListNode *p1=pHead1;

       ListNode *p2=pHead2;

       int len1=0,len2=0,diff=0;

       while(p1!=NULL){

           p1=p1->next;

           len1++;

       }

       while(p2!=NULL){

           p2=p2->next;

           len2++;

       }

       if(len1>len2){

           diff=len1-len2;

           p1=pHead1;

           p2=pHead2;

       }

       else{

           diff=len2-len1;

           p1=pHead2;

           p2=pHead1;

       }

       for(int i=0;i<diff;i++){

           p1=p1->next;

       }

       while(p1!=NULL && p2!=NULL){

           if(p1==p2)

               break;

           p1=p1->next;

           p2=p2->next;

       }

       return p1;

   }

};

解法2:相关子函数进行封装


class Solution {

public:

   ListNode* FindFirstCommonNode( ListNode *pHead1, ListNode *pHead2) {

       int len1 = findListLenth(pHead1);

       int len2 = findListLenth(pHead2);

       if(len1 > len2){

           pHead1 = walkStep(pHead1,len1 - len2);

       }else{

           pHead2 = walkStep(pHead2,len2 - len1);

       }

       while(pHead1 != NULL){

           if(pHead1 == pHead2) return pHead1;

           pHead1 = pHead1->next;

           pHead2 = pHead2->next;

       }

       return NULL;

   }

 

   int findListLenth(ListNode *pHead1){

       if(pHead1 == NULL) return 0;

       int sum = 1;

       while(pHead1 = pHead1->next) sum++;

       return sum;

   }

 

   ListNode* walkStep(ListNode *pHead1, int step){

       while(step--){

           pHead1 = pHead1->next;

       }

       return pHead1;

   }

};


目录
相关文章
|
1月前
|
算法
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
69 1
|
25天前
|
存储 算法 搜索推荐
链表的中间结点
【10月更文挑战第24天】链表的中间结点是链表操作中的一个重要概念,通过快慢指针法等方法可以高效地找到它。中间结点在数据分割、平衡检测、算法应用等方面都有着重要的意义。在实际编程中,理解和掌握寻找中间结点的方法对于解决链表相关问题具有重要价值。
14 1
|
2月前
链表的中间结点
链表的中间结点
179 57
|
5月前
|
算法
数据结构和算法学习记录——线性表之双向链表(上)-结点类型定义、初始化函数、创建新结点函数、尾插函数、打印函数、尾删函数
数据结构和算法学习记录——线性表之双向链表(上)-结点类型定义、初始化函数、创建新结点函数、尾插函数、打印函数、尾删函数
49 0
|
1月前
【LeetCode 09】19 删除链表的倒数第 N 个结点
【LeetCode 09】19 删除链表的倒数第 N 个结点
17 0
|
3月前
|
算法
LeetCode第19题删除链表的倒数第 N 个结点
该文章介绍了 LeetCode 第 19 题删除链表的倒数第 N 个结点的解法,通过使用快慢双指针,先将快指针移动 n 步,然后快慢指针一起遍历,直到快指针到达链尾,从而找到倒数第 N 个结点的前一个结点进行删除,同时总结了快慢指针可减少链表遍历次数的特点。
LeetCode第19题删除链表的倒数第 N 个结点
|
4月前
【数据结构OJ题】链表中倒数第k个结点
牛客题目——链表中倒数第k个结点
38 1
【数据结构OJ题】链表中倒数第k个结点
|
3月前
【刷题记录】链表的中间结点
【刷题记录】链表的中间结点
|
4月前
【数据结构OJ题】链表的中间结点
力扣题目——链表的中间结点
27 0
【数据结构OJ题】链表的中间结点
|
5月前
|
算法
19.删除链表的倒数第N个结点
19.删除链表的倒数第N个结点