编程之美 3.6 判断两个链表是否相交
问题本身很简单,考虑扩展问题:如果链表有环的话,又或者求解相交的第一个节点,个人认为都是采用计数的方法比较适合。也就是说设置一个hash表,记录指针指向的地址,无论求是否有环或者找到第一个相交的节点都可以。唯一缺点是需要额外的空间。
书上提到的第三个解法有些需要注意的地方:它不是一个线程安全的,因为在这个过程中,它改变的链表的结构(虽然最终会修改回来)。而且这种比较类型的功能函数一般都不应该更改它的值。
LNode* JudgeIntersect(LNode *la, LNode *lb){ LNode *p = la, *q = lb; while(p != NULL){ addrs.insert(p); p = p->next; } LSet::iterator end = addrs.end(); while(q != NULL){ LSet::iterator iter = addrs.find(q); if(iter != end) return *iter; q = q->next; } return NULL; }