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);  
    }  
  • 相关阅读:
    博客开篇--别让自己在临终前后悔
    预言帖,WP7迟早有一天会失败
    sql server 列值转列名的问题
    “《面对面做好每一天》中国短道速滑教练李琰”读后感
    原型要做到什么程度
    不得不承认我的高度不够,通过项目提升了.
    项目进度很慢
    原型确认后准备开发(1)
    邮件发送打印机更改打印机连接的通知
    onclick事件中加href
  • 原文地址:https://www.cnblogs.com/lihaozy/p/2782242.html
Copyright © 2011-2022 走看看