[转]判断两个链表是否有公共节点并返回第一个公共节点

转自: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);  
}  

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值