两个链表中的第一个公共结点
2015-08-18 10:17
507 查看
题目
输入两个链表,找出他们的第一个公共节点。下面第一个公共节点便是40。1->2->3-----\
>40->50
10->20->30----/
思路
看到栈就忽然恍然大悟,然后在看到类似快慢指针,更大悟。思路一:
分别遍历第一条链表和第二条链表,将其每个节点分别存入两个栈,然后依次出栈,最后一个相同的的栈顶元素就是第一个公共节点。
public static LinkListNode findtheFirstNode(LinkListNode head1,LinkListNode head2) { Stack<LinkListNode> st1 = new Stack<LinkListNode>(); Stack<LinkListNode> st2 = new Stack<LinkListNode>(); LinkListNode temp; for(temp=head1;temp!=null;temp=temp.next) st1.push(temp); for(temp= head2;temp!=null;temp=temp.next) st2.push(temp); LinkListNode result = null; while(st1.peek() == st2.peek()) { result = st1.pop(); st2.pop(); } return result; }思路二:
类似于判断链表是否有环的快慢指针,我们先求出两个链表的长度差多少,然后让长链表的指针先走多少,然后两个指针一块走,直到两个指针指向的值相等,便是第一个公共节点。
public static LinkListNode findFirstSameNode2(LinkListNode head1,LinkListNode head2) { LinkListNode result = null; int countOne = 0; int countTwo = 0; for(LinkListNode p = head1 ; p!=null ;p=p.next) countOne++; for(LinkListNode p = head2 ; p!=null ;p=p.next) countTwo++; LinkListNode pLonghead=head1; LinkListNode pShorthead = head2; int diff = countOne - countTwo; if(countOne < countTwo) { pLonghead = head2; pShorthead = head1; diff =countTwo-countOne ; } for(int i = 0;i<diff ;++i) { pLonghead = pLonghead.next; } while(pLonghead!=null && pShorthead!=null && pLonghead != pShorthead) { pLonghead = pLonghead.next; pShorthead = pShorthead.next; } return pLonghead; }
相关文章推荐
- 串口之ReadFile、WriteFile函数详解
- 详解SQLServer 2008 R2数据库SSAS建模及扩展能力
- 会员充值?!哪家视频网站在认真做产品
- PHP学习网站(phpstudy)
- MySql的like语句中的通配符:百分号、下划线和escape
- MySql中获取当前系统当前时间
- CF 549C 博弈
- Android TextView中显示图片
- oracle触发农产品证明文件号码
- NBUT 1223 Friends number (打表)
- C语言盲点笔记1
- 电脑显示器的最佳高度
- 两端居中
- AdaBoost算法
- Logistic回归与最大熵模型
- k近邻
- 决策树
- 数据库三范式详解
- LIBSVM使用方法及参数设置(转)
- 浅谈支持向量机