zoukankan      html  css  js  c++  java
  • [转]判断两个链表是否有公共节点并返回第一个公共节点

    转自:http://blog.csdn.net/randyjiawenjie/article/details/6329572

    判断两个链表是否有公共节点的方法最简单的就是遍历到每个链表的最后一个节点,看他们是否是同一个节点:如果是同一个节点的话,那么两个链表肯定有公共节点:

    解释:因为链表是线性结构,不想树那样的非线性分叉结构

    typedef struct LNode{  
        int data;  
        struct LNode *next;  
    }LNode, *LinkList;  

    一个链表有唯一的一个后序节点:如果两个链表中出现了公共节点,那么从该点开始,后面的节点都是公共的,肯定链表的最后一个节点也是公共的。于是不管三七二十一,遍历到最后链表的一个节点,判断两个节点是不是同一个节点就可以了。

    但是这里我们要返回第一个公共节点,所以还得寻去他法:

    1.如果两个链表有长度一样,我们从第一个逐个遍历节点,再比较是不是同一个节点就可以了;

    2.如果两个链表长度不一样,我们应该先让长的链表从表头“走” len1 - len2步(len1为list1的长度,len2为list2的长度),然后按照1中方法进行操作即可。

    # include <stdio.h>  
    # include <malloc.h>  
    typedef struct LNode{  
        int data;  
        struct LNode *next;  
    }LNode, *LinkList;  
    /** 
     * 采用数组a[]来初始化链表,数组的长度为length;head指向了头节点。 
     */  
    LinkList CreatList(int a[], int length)  
    {  
        LinkList head = (LinkList)malloc(sizeof(LNode));  
        head->next = NULL;  
        int index;  
        LinkList temp;  
        for (index = 0; index < length; index ++)  
        {  
            temp = (LinkList)malloc(sizeof(LNode));  
            temp->data = a[index];  
            temp->next = head->next;  
            head->next = temp;  
        }  
        return head;  
    }  
    /** 
     * 判断链表list1与链表list2是否相交,如果相交的话,就返回第一个相交点 
     * 注意相交的话,就是横着的Y字型 
     */  
    int isIntersect(LinkList list1, LinkList list2)  
    {  
        LinkList ptr1 = list1->next;  
        LinkList ptr2 = list2->next;  
        int len1 = getLength(list1);  
        int len2 = getLength(list2);  
        int step = len1 - len2;  
        int index;  
        if(step > 0)             //list1长,那么list1先走step;  
        {  
            for (index = 0; index < step; index ++)  
                ptr1 = ptr1->next;  
        }  
        else                    //list2长,那么list2先走step;  
        {  
            for (index = 0; index < -1 * step; index ++)  
                        ptr2 = ptr2->next;  
        }  
        while (ptr1 != NULL)  
        {  
            if (ptr1 == ptr2)  
                {  
                    printf("the first intersection node is %d/n", ptr1->data);  
                    return 1;  
                }  
            ptr1 = ptr1->next;  
            ptr2 = ptr2->next;  
        }  
        printf("there is no insection node between the two list");  
        return 0;  
    }  
    int main()  
    {  
    int a4[] = {1,2,3,4,5};  
        LinkList list = CreatList(a4,5);  
        LinkList current = list->next;  
        while (current->next)  
        {  
            current = current->next;  
        }  
        current->next = list->next->next;   //公共点为4  
        int result1 = isLoop(list);  
            getLoopNode(list);  
    }  
  • 相关阅读:
    K项目小记
    与职场中年女性聊天,一定要小心!
    不是自己的东西不要拿,是做人最起码的道理
    为什么很多人排斥中国女生嫁去外国?
    北大清华几十位硕士博士挤入街道办事处任职,我的几点看法
    面对一直在房价洼地的长沙,我不后悔十几年前逃离长沙
    SAP QM 源检验(Source Inspection)功能展示
    电视剧《猎毒人》观后感
    特朗普如能连任美国总统,于中国不是坏事
    python-day4-字符串,列表相关方法
  • 原文地址:https://www.cnblogs.com/lihaozy/p/2782242.html
Copyright © 2011-2022 走看看