您的位置:首页 > 职场人生

【剑指offer】面试题52:两个链表的第一个公共节点

2017-08-01 03:10 363 查看

题目

输入两个链表,找出它们的第一个公共结点。

思路

关键:

这题的关键点在于,这两个链表,如果有公共点,

那么从他们的公共点开始,到链表结束,在两个链表中是一致的。

解法1:

使用两个栈

解法2:

1.首先遍历两个链表得到它们的长度m, n (m > n)

2.在长度为m的链表上先走m-n步

3.同时在两个链表上遍历,第一个相同的节点就是他们的第一个公共节点

代码(解法2)

/**
* 题目:
* 输入两个链表,找出它们的第一个公共结点。
*
* 关键:
* 这题的关键点在于,这两个链表,如果有公共点,
* 那么从他们的公共点开始,到链表结束,在两个链表中是一致的。
*
* 解法1:
* 使用两个栈
*
* 解法2:
* 1.首先遍历两个链表得到它们的长度m, n (m > n)
* 2.在长度为m的链表上先走m-n步
* 3.同时在两个链表上遍历,第一个相同的节点就是他们的第一个公共节点
*
* @author peige
*/
public class _52_FirstCommonNodesInLists {

public static class ListNode {
public int val;
public ListNode next = null;
ListNode(int val) {
this.val = val;
}
}

public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
if(pHead1 == null || pHead2 == null)
return null;
int len1 = 0;
int len2 = 0;
ListNode cur1 = pHead1;
ListNode cur2 = pHead2;
// 求链表1、链表2长度
for(ListNode cur = pHead1; cur != null; cur = cur.next)
++len1;
for(ListNode cur = pHead2; cur != null; cur = cur.next)
++len2;
if(len1 > len2) {
for(int i = 0; i < len1 - len2; ++i)
cur1 = cur1.next;
}
else {
for(int i = 0; i < len2 - len1; ++i)
cur2 = cur2.next;
}
while(cur1 != null) {
if(cur1 == cur2)
return cur1;
cur1 = cur1.next;
cur2 = cur2.next;
}
return null;
}
}


测试

/**
* 太简单了就不测试了 0.0
*
* @author peige
*/
public class _52_Test {

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: