每日一题——两个链表的第一个公共节点

简介: 每日一题——两个链表的第一个公共节点

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

题目链接

思路

分析:

  • 首先,让我们考虑特殊情况,如果两个链表的·长度相同,那我们定义两个指针变量cur1,cur2,使其分别指向两个表头,并让其一起对表一表二逐个遍历,如果cur1等于cur2,则可以直接返回cur1。
  • 当cur1不为空时,说明两链表有公共节点,反之,当cur1为NULL,说明两链表无公共节点
  • 两个链表长度不同,显然不好进行计算。
  • 因此,我们就需要采取办法使cur1和cur2处在相同位置。

方法一

  • 我们可以分别求出表一和表二的长度,并算出它们的长度差count,再定义两个指针变量cur1,cur2,使其分别指向两个表头。
  • 让长的链表的cur指针先走count个节点
  • 最后让cur1和cur2一起每次走一个节点,当其相等时,返回cur1

方法二

  • 设表一长度为A,表二长度为B,则易得:A + B = B + A
  • 由上面的关系,我们定义两个指针变量cur1,cur2,使其分别指向两个表头,并让其同时每次移动一个节点
  • 当cur1为空时,则下次移动时,让cur1指向表二的头,同理,当cur2为空时,则下次移动时,让cur2指向表一的头
  • 相当于把整个表二接在表一前,把整个表一接在表二前,这样,两表的长度就相同了
  • 如图:
  • 这样,当cur1与cur2相等时,即可返回cur1

实现代码

方法一

/**
 * struct ListNode {
 *  int val;
 *  struct ListNode *next;
 * };
 */
/**
 * 
 * @param pHead1 ListNode类 
 * @param pHead2 ListNode类 
 * @return ListNode类
 */
struct ListNode* FindFirstCommonNode(struct ListNode* pHead1, struct ListNode* pHead2 ) {
    struct ListNode* cur1, *cur2;
    int count1 = 1,count2 = 1,count3;
    cur1 = pHead1;
    cur2 = pHead2;
    while(cur1)     //计算表一长度
    {;
        count1++;
        cur1 = cur1->next;
    }
    while(cur2)   //计算表二长度
    {
        count2++;
        cur2 = cur2->next;
    }
    cur1 = pHead1;    //使cur1和cur2重新指向表一表二的头节点
    cur2 = pHead2;
    count3 = fabs((double)count1 - (double)count2);   //计算长度差
    //让长的链表先走count3个节点
    if(count1 > count2)     
    {
        while(count3--)
            cur1 = cur1->next;
    }
    if(count1 < count2)
    {
        while(count3--)
            cur2 = cur2->next;
    }
    //找到第一个公共节点
    while(1)
    {
        if(cur1 == cur2)
            return cur1;
        cur1 = cur1->next;
        cur2 = cur2->next;
    }
}

方法二

/**
 * struct ListNode {
 *  int val;
 *  struct ListNode *next;
 * };
 */
/**
 * 
 * @param pHead1 ListNode类 
 * @param pHead2 ListNode类 
 * @return ListNode类
 */
struct ListNode* FindFirstCommonNode(struct ListNode* pHead1, struct ListNode* pHead2 ) {
    struct ListNode* cur1 = pHead1;
    struct ListNode* cur2 = pHead2;
    while(cur1 != cur2)
    {
        cur1 = cur1 ? cur1->next : pHead2;    //如果cur1为空,那么cur1指向表二的头,否则cur1指向下一个节点
        cur2 = cur2 ? cur2->next : pHead1;    //cur2同理
    }
    return cur1;
}


相关文章
|
8月前
|
存储 Python
链表中插入节点
链表中插入节点
|
3月前
LeetCode第二十四题(两两交换链表中的节点)
这篇文章介绍了LeetCode第24题的解法,即如何通过使用三个指针(preNode, curNode, curNextNode)来两两交换链表中的节点,并提供了详细的代码实现。
30 0
LeetCode第二十四题(两两交换链表中的节点)
|
3月前
Leetcode第十九题(删除链表的倒数第N个节点)
LeetCode第19题要求删除链表的倒数第N个节点,可以通过快慢指针法在一次遍历中实现。
48 0
Leetcode第十九题(删除链表的倒数第N个节点)
05_删除链表的倒数第N个节点
05_删除链表的倒数第N个节点
|
3月前
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
57 0
|
5月前
|
算法
LeetCode第24题两两交换链表中的节点
这篇文章介绍了LeetCode第24题"两两交换链表中的节点"的解题方法,通过使用虚拟节点和前驱节点技巧,实现了链表中相邻节点的交换。
LeetCode第24题两两交换链表中的节点
04_两两交换链表中的节点
04_两两交换链表中的节点
|
5月前
|
Python
【Leetcode刷题Python】剑指 Offer 22. 链表中倒数第k个节点
Leetcode题目"剑指 Offer 22. 链表中倒数第k个节点"的Python解决方案,使用双指针法找到并返回链表中倒数第k个节点。
60 5
|
5月前
|
Python
【Leetcode刷题Python】剑指 Offer 18. 删除链表的节点
Leetcode题目"剑指 Offer 18. 删除链表的节点"的Python解决方案,通过使用双指针法找到并删除链表中值为特定数值的节点,然后返回更新后的链表头节点。
47 4
|
6月前
|
安全 云计算
云计算自旋锁问题之在线程安全地删除链表节点时,需要频繁加锁会影响性能如何解决
云计算自旋锁问题之在线程安全地删除链表节点时,需要频繁加锁会影响性能如何解决
58 2

热门文章

最新文章