判断两个链表是否有公共节点并返回第一个公共节点
2013-03-19 00:09
351 查看
判断两个链表是否有公共节点的方法最简单的就是遍历到每个链表的最后一个节点,看他们是否是同一个节点:如果是同一个节点的话,那么两个链表肯定有公共节点:
解释:因为链表是线性结构,不想树那样的非线性分叉结构
从链表的定义,就知道:
[c-sharp] view
plaincopy
typedef struct LNode{
int data;
struct LNode *next;
}LNode, *LinkList;
一个链表有唯一的一个后序节点:如果两个链表中出现了公共节点,那么从该点开始,后面的节点都是公共的,肯定链表的最后一个节点也是公共的。于是不管三七二十一,遍历到最后链表的一个节点,判断两个节点是不是同一个节点就可以了。
但是这里我们要返回第一个公共节点,所以还得寻去他法:
1.如果两个链表有长度一样,我们从第一个逐个遍历节点,再比较是不是同一个节点就可以了;
2.如果两个链表长度不一样,我们应该先让长的链表从表头“走” len1 - len2步(len1为list1的长度,len2为list2的长度),然后按照1中方法进行操作即可。
[c-sharp] view
plaincopy
# 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);
}
解释:因为链表是线性结构,不想树那样的非线性分叉结构
从链表的定义,就知道:
[c-sharp] view
plaincopy
typedef struct LNode{
int data;
struct LNode *next;
}LNode, *LinkList;
一个链表有唯一的一个后序节点:如果两个链表中出现了公共节点,那么从该点开始,后面的节点都是公共的,肯定链表的最后一个节点也是公共的。于是不管三七二十一,遍历到最后链表的一个节点,判断两个节点是不是同一个节点就可以了。
但是这里我们要返回第一个公共节点,所以还得寻去他法:
1.如果两个链表有长度一样,我们从第一个逐个遍历节点,再比较是不是同一个节点就可以了;
2.如果两个链表长度不一样,我们应该先让长的链表从表头“走” len1 - len2步(len1为list1的长度,len2为list2的长度),然后按照1中方法进行操作即可。
[c-sharp] view
plaincopy
# 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);
}
相关文章推荐
- [LeetCode] 判断两个链表是否有公共节点并返回第一个公共节点
- 判断两个链表是否有公共节点并返回第一个公共节点
- [LeetCode] 判断两个链表是否有公共节点并返回第一个公共节点
- [LeetCode] 判断两个链表是否有公共节点并返回第一个公共节点
- [转]判断两个链表是否有公共节点并返回第一个公共节点
- 判断两个链表是否相交;查找两个链表的第一个公共节点;头插法建链表(补充)
- 已知有两个链表,判断它们是否相交,若相交求其第一个公共节点
- 两链表的第一个公共结点(比较两个链表节点是否相同时比较不了啊,该题尚未完成)
- 单向链表相交的第一个公共结点, 判断链表是否有环以及环的入口节点
- 判断两个链表是否相交并找出第一个相交节点
- 判断两个链表是否相交,及其第一个公共交点
- 判断链表是否有环,如果有返回入环的第一个节点。
- 转:判断两个单向链表是否相交,并找到两个单向链表的第一个相交节点
- 判断两个链表是否相交及获得相交的第一个节点
- 两个单向链表,判断它们是否相交,若相交,找出它们的第一个公共的结点
- 判断两个链表是否相交并且返回第一个交点
- 判断两个单链表是否相交同时找出第一个相交点(单链表是否有环及寻找入口节点)
- 判断两个链表是否相交,若相交,则找出相交的第一个节点
- 判断两个无环单向链表/有环单向链表是否相交,并返回相交节点
- 链表是否存在环及环入口点、两个链表是否相交、相交链表的第一个公共结点