题目要求
输入两个链表,找出它们的第一个公共结点。
解题思路
相对于判断两个不同长度的链表,我们更喜欢判断同样长度的链表中的异同。
那么如果输入是不同长度的我们怎么处理呢? 这里边说一个常用的方法,就是组合链表1和链表2 即 l1+l2 = l2 + l1 (l1,l2分别是链表1和链表2的长度)
根据这个分析方法,我们能写出以下是代码,分别遍历链表1和链表2,当表1到末尾时去遍历表2,当表二到末尾时遍历表一。这样如果有共同的节点,我们一定能同时遍历到。
更详细的解题步骤,可以参考:解答:leetcode160. Intersection of Two Linked Lists(寻找两个链表的交叉点)
主要代码c++
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
ListNode *p1 = pHead1;
ListNode *p2 = pHead2;
while(p1 != p2)
{
p1 = p1?p1->next:pHead2; // 一定是判断p1存不存在,如果是p1->next每次会跳过最后一个元素,从而进入死循环
p2 = p2?p2->next:pHead1; // 先要到达空节点,才能继续道另一个了链表的节点。
}
return p1;
}
};