【1】题目
题目:输入两个链表,找出它们的第一个公共结点。链表结点定义如下:
【2】思路
(1)经过分析我们发现,如果两个链表有公共结点,那么公共结点出现在两个链表的尾部。如果我们从两个链表的尾部开始往前比较,最后一个相同的结点就是我们要找的结点。可问题是在单向链表中,我们只能从头结点开始按顺序遍历,最后才能到达尾结点。最后到达的尾结点却要最先被比较,这听起来是不是像“后进先出”?于是我们就能想到用栈的特点来解决这个问题:分别把两个链表的结点放入两个栈里,这样两个链表的尾结点就位于两个栈的栈顶,接下来比较两个栈顶的结点是否相同。如果相同,则把栈顶弹出接着比较下一个栈顶,直到找到最后一个相同的结点。
(2)前后两个指针法
【3】代码
// Test36.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include "pch.h"
#include <iostream>
struct ListNode
{
int m_nkey;
ListNode * m_pnext;
};
int GetListLength(ListNode *pHead)
{
int unsigned listlength = 0;
if (pHead->m_pnext==nullptr)
{
return listlength;
}
while (pHead!=nullptr)
{
listlength++;
pHead = pHead->m_pnext;
}
return listlength;
}
ListNode *GetFirstCommandNode(ListNode *pHead1 , ListNode *pHead2)
{
if (pHead1==nullptr|| pHead2 == nullptr)
{
return;
}
//确定长短链表
int length1 = GetListLength(pHead1);
int length2 = GetListLength(pHead2);
ListNode * longlist = pHead1;
ListNode * shortlist = pHead2;
int distance = length1 - length2;
if (length1< length2)
{
longlist = pHead2;
shortlist = pHead1;
distance = length2 - length1;
}
//长链表先走distance
for (int i = 0; i < distance; i++)
{
longlist = longlist->m_pnext;
}
while (longlist!=nullptr|| shortlist!= nullptr|| longlist!= shortlist)
{
longlist = longlist->m_pnext;
shortlist = shortlist->m_pnext;
}
ListNode * firstlistnode = longlist;
}
int main()
{
std::cout << "Hello World!\n";
}