判断两个链表是否有公共节点并返回第一个公共节点
来源:互联网 发布:linux 找不到命令 编辑:程序博客网 时间:2024/04/19 06:03
判断两个链表是否有公共节点的方法最简单的就是遍历到每个链表的最后一个节点,看他们是否是同一个节点:如果是同一个节点的话,那么两个链表肯定有公共节点:
解释:因为链表是线性结构,不想树那样的非线性分叉结构
从链表的定义,就知道:
- 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);
- }
- 判断两个链表是否有公共节点并返回第一个公共节点
- 判断两个链表是否有公共节点并返回第一个公共节点
- [LeetCode] 判断两个链表是否有公共节点并返回第一个公共节点
- [LeetCode] 判断两个链表是否有公共节点并返回第一个公共节点
- 已知有两个链表,判断它们是否相交,若相交求其第一个公共节点
- 两个链表的公共第一个公共节点
- 单向链表相交的第一个公共结点, 判断链表是否有环以及环的入口节点
- 找到两个单向链表的第一个公共节点
- 找到两个单向链表的第一个公共节点
- 找到两个单向链表的第一个公共节点
- 两个单向链表的第一个公共节点
- 两个链表中的第一个公共节点
- 两个链表的第一个公共节点
- 寻找两个相交链表的第一个公共节点
- 两个链表的第一个公共节点
- 寻找两个相交链表的第一个公共节点
- 寻找两个相交链表的第一个公共节点
- 两个链表的第一个公共节点
- solaris10安装心得
- 我的中国梦
- SGU 155 Cartesian Tree(线段树)#by zh
- 何海涛:《剑指Offer:名企面试官精讲典型编程题》 之二维数组中的查找
- Android中attr自定义属性详解(format的10种属性值)
- 判断两个链表是否有公共节点并返回第一个公共节点
- csv技术测试框架
- mac环境变量设置文件
- JEECG v3.0.beta发布,基于代码生成器的智能开发平台
- 图像处理索引
- mac下rar安装使用
- 10026 - Shoemaker's Problem
- DVD 自动分割软件
- java类私有成员在本类中可以任意访问