lintcode刷题——两个链表的交叉

原题如下所示:

两个链表的交叉 

请写一个程序,找到两个单链表最开始的交叉节点。

 注意事项
  • 如果两个链表没有交叉,返回null
  • 在返回结果后,两个链表仍须保持原有的结构。
  • 可假定整个链表结构中没有循环。
样例

下列两个链表:

A:          a1 → a2
                   ↘
                     c1 → c2 → c3
                   ↗            
B:     b1 → b2 → b3

在节点 c1 开始交叉。

做题思路如下:
1、首先排除特殊情况,如果两个链表有一个为空或者都为空,则返回NULL;

2、两个链表不为空的时候,先求出两个链表的长度,如果一样长,则比较好办,两个指针从A,B的头结点往后移进行比较即可,如果不一样长,则先把长的链表往后移,移到和短的链表一样长的位置开始,同样重复之前的步骤,一起往后移进行对比;

3、在计算链表长度的时候,有一个点,就是最后指针都指向的是链表最后的节点,如果此时两个指针不相等,则两个链表一定没有交点。

具体的C++代码如下:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    /**
     * @param headA: the first list
     * @param headB: the second list
     * @return: a ListNode
     */
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        // write your code here
        if(headA==NULL||headB==NULL)
        {
            return NULL;
        }
        ListNode *p1=headA;
        int l1=0;
        while(p1->next!=NULL)
        {
            l1++;
            p1=p1->next;
        }
        ListNode *p2=headB;
        int l2=0;
        while(p2->next!=NULL)
        {
            l2++;
            p2=p2->next;
        }
        if(p1!=p2)
        {
            return NULL;
        }
        p1=headA;
        p2=headB;
        int i;
        if(l1         {
            for(i=0;i             {
                p2=p2->next;
            }
            
        }
        else if(l1>l2)
        {
            for(i=0;i             {
                p1=p1->next;
            }
        }
        while(p1!=p2)
        {
            p1=p1->next;
            p2=p2->next;
        }
        return p1;
       
    }
};

你可能感兴趣的:(lintcode刷题)