剑指Offer---面试题37:两单链表中第一个公共节点
2017-02-16 12:15
309 查看
一 题目
输入两个链表,找出它们的第一个公共结点。public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } }
二 思路
假设单链表1表长n, 单链表2表长m;思路1:遍历单链表1(表长n),每遍历一个节点就循环遍历单链表2(表长m)所有节点,若发现节点的
val域相同,则返回该节点,若单链表1遍历结束任然未发现相同的节点,则返回
null。
时间复杂度
n(nm)。
思路2:若两单链表存在公共节点,那么从第一个公共节点开始一直到尾节点,都是相同的。那么我们从尾节点开始向前扫描,扫描到最后一个相同的节点时候,该节点就是第一个公共节点。 但是单链表具备单向可及性想拿到尾节点就必须从头开始扫描,所以可以使用栈的特性先进后出来解决这一问题。(即扫描到的第一个节点最后比较,扫描到的最后一个节点最先比较,两个栈)
时间复杂度
o(m+n);空间复杂度
o(m+n)
思路3:前面 剑指Offer—面试题15:链表中的倒数第k个节点中提到:当我们用一个指针不能解决链表问题的时 候,我们可以用两个指针,一个走得快一点,一个走的慢一点,或者可以让一个指针在链表中先走上若干步;
这道题目仍然可以使用这种思路来解决,首先我们计算出两链表的差值
firstStep,然后让较长链表的头指针先走
firstStep步,然后两链表头指针同时往后面走,当碰到第一个
val域相同的节点时,该节点就是第一个公共的节点;
时间复杂度
n(n+m)。
三 代码
public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) { if(pHead1==null||pHead2==null){ return null; } ListNode tempP1=pHead1; ListNode tempP2=pHead2; int length1=0,length2=0,firstStep=0; while(tempP1.next!=null){ length1+=1; tempP1=tempP1.next; } while(tempP2.next!=null){ length2+=1; tempP2=tempP2.next; } //两链表长度的差值 firstStep=length1-length2; //若链表1长些,则链表1头指针先走 if(firstStep>0){ while(firstStep!=0){ pHead1=pHead1.next; --firstStep; } }else{ //若链表2长些,则链表2头指针先走 while(firstStep!=0){ pHead2=pHead2.next; ++firstStep; } } //两头指针再一起走,碰到相同的就返回 while(pHead1!=null&&pHead2!=null){ if(pHead1.val==pHead2.val){ return pHead1; }else{ pHead1=pHead1.next; pHead2=pHead2.next; } } return null; }
四 总结
从时间复杂度和空间复杂度的角度去考虑这个问题,根据具体情况使用具体的方法。当我们用一个指针不能解决链表问题的时 候,我们可以用两个指针,一个走得快一点,一个走的慢一点,或者可以让一个指针在链表中先走上若干步
相关文章推荐
- 【面试题】剑指Offer-37-求两个链表的第一个公共节点
- [剑指offer][面试题37]两个链表的第一个公共节点
- 【剑指Offer学习】【面试题37:两个链表的第一个公共结点】
- 【剑指offer】面试题37:两个链表的第一个公共结点
- 剑指offer 37 - 两个链表的第一个公共节点
- 【剑指offer】面试题37:两个链表的第一个公共结点
- [剑指Offer 37] 两个链表的第一个公共节点(Python)
- 剑指offer 37:求两个链表的第一个公共节点
- 剑指Offer 37题 两个链表的第一个公共节点 Java版
- 找到两个链表的第一个公共节点 37--剑指offer
- 剑指offer--面试题37:两个链表的第一个公共结点
- 剑指offer 面试题37 两个链表的第一个公共结点
- 【剑指Offer】面试题37:两个链表的第一个公共结点
- 剑指offer-面试题37-两个链表的第一个公共结点
- 剑指offer-面试题37-两个链表的第一个公共结点
- 剑指offer——面试题37:两个链表的第一个公共结点
- 【剑指offer】面试题52:两个链表的第一个公共节点
- 剑指offer——面试题37:两个链表的第一个公共结点
- 剑指Offer面试题37(Java版):两个链表的第一个公共结点
- 【剑指offer】5.3时间效率与空间效率的平衡——面试题37:两个链表的第一个公共结点