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

来源:互联网 发布:淘宝卖家开花呗条件 编辑:程序博客网 时间:2024/05/29 10:20

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

思路:如果两个链表有公共节点,那么它们在第一个公共节点以后的节点都相同。

1)分别求出两个链表的长度length1和length2;

2)求出两个链表长度差dif;

3)让长的链表先从头往后先走dif步

4)连个链表同时走,直到指针相同为止,返回当前指针。

5)如果两链表走到头也地址不相同,则返回NULL

代码如下:

/*struct ListNode {int val;struct ListNode *next;ListNode(int x) :val(x), next(NULL) {}};*/class Solution {public:    unsigned int GetListLength(ListNode* pHead){        unsigned int length = 0;        ListNode* pNode = pHead;        while(pNode != NULL){            length++;            pNode = pNode->next;        }                return length;    }    ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {        if(pHead1 == NULL || pHead2 == NULL)            return NULL;        ListNode* p1 = pHead1;        ListNode* p2 = pHead2;        unsigned int length1 = GetListLength(p1);         unsigned int length2 = GetListLength(p2);                 if(length1 > length2){            while((length1--) > length2){                p1 = p1->next;            }        }                else if(length2 > length1){//注意这里一定是else if,用if会出错,因为前面length1--导致的            while((length2--) > length1){                p2 = p2->next;            }        }                while(p1 != NULL && p2 != NULL){            if(p1 == p2)                return p1;            else{                p1 = p1->next;                p2 = p2->next;            }        }                return NULL;                }};



阅读全文
0 0
原创粉丝点击