判断链表是否相交

一、问题描述

编写一个程序来查找两个单独链接列表的交集开始的节点。
例如,以下两个链表:
A:          a1 → a2
                   ↘
                     c1 → c2 → c3
                   ↗
B:     b1 → b2 → b3


开始在节点c1相交。
【提示】
如果两个链表完全没有交集,则返回null。
链接列表在函数返回后必须保留其原始结构。
您可能会认为整个链接结构中没有任何地方的循环。
您的代码应该最好在O(n)时间内运行,并只使用O(1)内存。

二、解题思路

1)将A重定向到B,得到一个新链表
2)将B重定向到A,得到一个等长的新链表
3)遍历这两个新链表,如果同时为空,说明并不会相交,
如果找到相同的元素,则该元素就是相交的元素

三、解题算法

/*************************************************
Author:tmw
date:2018-4-14
*************************************************/
#include <stdio.h>
#include <stdlib.h>

typedef struct listnode
{
    int data;
    struct listnode* next;
}listnode;

listnode* getIntersectionNode( listnode* headA, listnode* headB )
{
    /**入口检查:当两者任意一个为空,则返回NULL**/
    if( headA == NULL || headB == NULL )
        return NULL;

    else
    {
        listnode* pa;
        listnode* pb;
        pa = headA;
        pb = headB;
        int flagA = 0;
        int flagB = 0;

        while( pa && pb ) /**约定链表没有头指针,首位即存有值**/
        {
            if( pa->data == pb->data )
                return pa;

            pa = pa->next;
            pb = pb->next;

            /**将A重定向到B,得到一个新链表**/
            /**flagA用于只重定向一次,避免程序重复重定向而死循环了**/
            if( pa == NULL && flagA == 0 )
            {
                pa = headB;
                flagA = 1;
            }

            /**将B重定向到A,得到一个等长的新链表**/
            /**flagB作用同flagA**/
            if( pb == NULL && flagB == 0 )
            {
                pb = headA;
                flagB = 1;
            }
        }
        /**还没找到,则说明两个链表没有交点**/
        return NULL;
    }
    return NULL;
}



梦想还是要有的,万一实现了呢~~~ヾ(◍°∇°◍)ノ゙~~~~

猜你喜欢

转载自blog.csdn.net/qiki_tangmingwei/article/details/80935805