一、问题描述
编写一个程序来查找两个单独链接列表的交集开始的节点。
例如,以下两个链表:
A: a1 → a2
↘
c1 → c2 → c3
↗
B: b1 → b2 → b3
开始在节点c1相交。
【提示】
如果两个链表完全没有交集,则返回null。
链接列表在函数返回后必须保留其原始结构。
您可能会认为整个链接结构中没有任何地方的循环。
您的代码应该最好在O(n)时间内运行,并只使用O(1)内存。
二、解题思路
1)将A重定向到B,得到一个新链表2)将B重定向到A,得到一个等长的新链表
3)遍历这两个新链表,如果同时为空,说明并不会相交,
如果找到相同的元素,则该元素就是相交的元素
三、解题算法
/*************************************************
Author:tmw
date:2018-4-14
*************************************************/
#include <stdio.h>
#include <stdlib.h>
typedef struct listnode
{
int data;
struct listnode* next;
}listnode;
listnode* getIntersectionNode( listnode* headA, listnode* headB )
{
/**入口检查:当两者任意一个为空,则返回NULL**/
if( headA == NULL || headB == NULL )
return NULL;
else
{
listnode* pa;
listnode* pb;
pa = headA;
pb = headB;
int flagA = 0;
int flagB = 0;
while( pa && pb ) /**约定链表没有头指针,首位即存有值**/
{
if( pa->data == pb->data )
return pa;
pa = pa->next;
pb = pb->next;
/**将A重定向到B,得到一个新链表**/
/**flagA用于只重定向一次,避免程序重复重定向而死循环了**/
if( pa == NULL && flagA == 0 )
{
pa = headB;
flagA = 1;
}
/**将B重定向到A,得到一个等长的新链表**/
/**flagB作用同flagA**/
if( pb == NULL && flagB == 0 )
{
pb = headA;
flagB = 1;
}
}
/**还没找到,则说明两个链表没有交点**/
return NULL;
}
return NULL;
}
梦想还是要有的,万一实现了呢~~~ヾ(◍°∇°◍)ノ゙~~~~