《剑指offer》-两个链表的第一个公共结点

来源:互联网 发布:网络电视手机在线直播 编辑:程序博客网 时间:2024/05/28 04:54

题目描述

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


解法:

一、暴力法,第一个链表从开头遍历,和第二个链表的每个节点元素比较,则需要两个for嵌套循环,那么复杂度是o(mn)

二、低复杂度法,最长的链表先行遍历,然后再同时遍历比较相等的节点。复杂度为o(n+m)

/*struct ListNode {int val;struct ListNode *next;ListNode(int x) :val(x), next(NULL) {}};*/class Solution {public:    ListNode* FindFirstCommonNode( ListNode *pHead1, ListNode *pHead2) {        unsigned int len1 = getListNode(pHead1);        unsigned int len2 = getListNode(pHead2);        int lenDiff = len1 - len2;;         ListNode* pHeadLong = pHead1;        ListNode* pHeadShort = pHead2;          if(len1 < len2) {            pHeadLong = pHead2;            pHeadShort = pHead1;            lenDiff = len2 - len1;        }               for(int i = 0; i < lenDiff; ++i){            pHeadLong = pHeadLong->next;        }        while(pHeadLong && pHeadShort && pHeadLong != pHeadShort) {            pHeadLong = pHeadLong->next;            pHeadShort = pHeadShort->next;        }        ListNode* firstCom = pHeadLong;        return firstCom;    }    unsigned int getListNode(ListNode* pHead) {        ListNode* p = pHead;        unsigned int len = 0;        while(p) {            ++len;            p = p->next;        }        return len;    }};


0 0
原创粉丝点击