ZqrFerrari
努力学习,开心生活

假设两条链表有公共节点Node, 那么从Node往后的节点必定都是公共节点. 也就是这两个链表成"Y"的形状. 那么两个链表的长度差只会出现在Node之前.

Node *find_first_common(Node *head1, Node *head2) {
    int m = 0;
    int n = 0;
    Node *p1 = head1;
    Node *p2 = head2;
    int i;
    while(p1) {
     m++;
     p1 = p1->next;
    }

   while(p2) {
    n++;
    p2 = p2->next;
   }
   p1 = head1;
   p2 = head2;
   if(m>n) {
    for(i=0;i<m-n;i++) {  p1 = p1->next; }
  } else {
    for(i=0;i<n-m;i++) {  p2 = p2->next; }
  }
  while(p1!=p2) {
    p1 = p1->next;
    p2 = p2->next;
  }
  return p1;
}

 

扩展:

  这个问题可以和(1)中的有环链表问题混合起来, 也就是说找到2个可能有环链表的公共节点. 这样的话我们需要在多加一个快指针在第一条(或第二条)链表上面. 这样如果存在环的话我们需要先把环解开, 然后再用上述方法找到第一个公共节点. 

posted on 2010-07-12 23:23  赵情融  阅读(1021)  评论(0)    收藏  举报