剑指 Offer 52. 两个链表的第一个公共节点

目录

  • 一、题目内容
  • 二、题解思路
  • 三、代码

一、题目内容

剑指 Offer 52. 两个链表的第一个公共节点_第1张图片
剑指 Offer 52. 两个链表的第一个公共节点

二、题解思路

1、定义两个指针分别指向两个链表的头结点。我们知道a + b +c = c + b +a这公式怎么利用在这道题中呢?下面来看看
剑指 Offer 52. 两个链表的第一个公共节点_第2张图片
我们用两个指针分别从各自链表头结点同时开始遍历,自己的链表先遍历一遍,当遍历的链表结束时,让结束了的链表的指针指向另外一个链表的头结点。继续遍历,如果链表有相交的结点,他们最后会遍历到同一个节点。
A链表的遍历路径a1-a2-c1-c2-c3-b1-b2-b3-c1
B链表的遍历路径b1-b2-b3-c1-c2-c3-a1-a2-c1
它们同时遍历,当遍历到第8步时会相遇,相遇的结点也就是两链表第一次相交的结点

三、代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) 
{
     
    if(headA == NULL || headB == NULL)
    {
     
        return NULL;
    }
    struct ListNode *cur1 = headA;
    struct ListNode *cur2 = headB;
    while(1)
    {
     
        //相遇
        if(cur1 == cur2)
        {
     
            return cur1;
        }
        else
        {
     
            //不相遇就往下走
            cur1 = cur1->next;
            cur2 = cur2->next;
        }
        //往下走同时为空,表示链表并没有相交
        if(cur1 == NULL && cur2 == NULL)
            break;
        if(cur1 == NULL)
            cur1 = headB;
        if(cur2 == NULL)
            cur2 = headA;
    }
    return NULL;
}

你可能感兴趣的:(链表,指针)