剑指offer面试题[37]-两个链表的第一个公共结点

来源:互联网 发布:php网站开发入门 编辑:程序博客网 时间:2024/06/15 10:35

题目描述

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

/*struct ListNode {int val;struct ListNode *next;ListNode(int x) :val(x), next(NULL) {}};*///思路://如果两个链表有公共结点,那么两个第一个公共结点后面的结点都是相同的,若链表1的长度比链表2的长度大len,//则需要将链表1起始结点向后移动len个长度,确保两个链表初始比较结点后面的长度是一样的。//链表的初始化其实就是链表的创建的过程,它的初始化其实和变量、//指针的初始化一样,如果你定义了一个指针,而没有对其进行初始化,//这个指针就是一个“野指针”,指向一块垃圾内存,这是很危险的,//链表的初始化就是为了让程序员能够获取链表的首地址,然后对其进行插入、删除、排序等操作了!class Solution {public:    ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {        int len,len1,len2;        ListNode* res=NULL;  //初始化一个链表让其为空        if(pHead1==NULL||pHead2==NULL)   //若两个链表有一个为空,则返回空链表res              return res;                       ListNode* pNode1=pHead1;    //这里很重要,计算原始两个链表的长度时,不能在原始的结点上操作        ListNode* pNode2=pHead2;        while(pNode1!=NULL)    //计算pHead1的长度            {               ++len1;               pNode1=pNode1->next;            }        while(pNode2!=NULL)     //计算pHead2的长度            {  ++len2;               pNode2=pNode2->next;            }        len=(len1>len2)?(len1-len2):(len2-len1);  //pHead1与pHead2的长度差len        if(len1>len2)             //这里的意思是,如果pHead1的长度大于pHead2的长度,将pHead1往后移动len          {            for(int i=0;i<len;i++)               pHead1=pHead1->next;          }        else                     //如果pHead2的长度大于pHead1的长度,将pHead2往后移动len          {            for(int i=0;i<len;i++)               pHead2=pHead2->next;          }        while(pHead1!=NULL&&pHead2!=NULL)            {            if(pHead1->val!=pHead2->val)   //不相等,pHead1和pHead2分别往后移动一个长度             {               pHead1=pHead1->next;               pHead2=pHead2->next;             }             else             //相等,将结果赋给res,并结束while循环             {               res=pHead1;               break;              }          }        return res;    }};


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