编程算法 - 两个链表的第一个公共结点 代码(C)

两个链表的第一个公共结点 代码(C)

本文地址: http://blog.csdn.net/caroline_wendy

题目: 输入两个链表, 找出它们的第一个公共结点.

计算链表的长度, 然后移动较长链表的指针, 使其到相同结点的距离的相同, 再同时移动两个链表的指针, 找到相同元素.

时间复杂度: O(n)

代码:

/*
 * main.cpp
 *
 *  Created on: 2014.6.12
 *      Author: Spike
 */

/*eclipse cdt, gcc 4.8.1*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct ListNode {
	int m_nKey;
	ListNode* m_pNext;
};

size_t GetListLength (ListNode* pHead) {
	size_t nLength = 0;
	ListNode* pNode = pHead;
	while (pNode != NULL) {
		++nLength;
		pNode = pNode->m_pNext;
	}
	return nLength;
}

ListNode* FindFirstCommonNode(ListNode* pHead1, ListNode* pHead2) {
	size_t nLength1 = GetListLength(pHead1);
	size_t nLength2 = GetListLength(pHead2);
	int nLengthDif = nLength1 - nLength2;
	ListNode* pListHeadLong = pHead1;
	ListNode* pListHeadShort = pHead2;
	if (nLength2 > nLength1) {
		pListHeadLong = pHead2;
		pListHeadShort = pHead1;
		nLengthDif = nLength2 - nLength1;
	}

	for (int i=0; i<nLengthDif; ++i)
		pListHeadLong = pListHeadLong->m_pNext;

	while ((pListHeadLong != NULL) && (pListHeadShort != NULL)
			&& (pListHeadLong != pListHeadShort)) {
		pListHeadLong = pListHeadLong->m_pNext;
		pListHeadShort = pListHeadShort->m_pNext;
	}

	ListNode* pFirstCommonNode = pListHeadLong;
	return pFirstCommonNode;
}

int main(void)
{
	ListNode* pHead1 = new ListNode();
	ListNode* pHead1Node1 = new ListNode();
	ListNode* pHead1Node2 = new ListNode();
	ListNode* pHead1Node3 = new ListNode();
	ListNode* pHead1Node4 = new ListNode();
	pHead1->m_nKey = 1;
	pHead1Node1->m_nKey = 2;
	pHead1Node2->m_nKey = 3;
	pHead1Node3->m_nKey = 6;
	pHead1Node4->m_nKey = 7;
	pHead1->m_pNext = pHead1Node1;
	pHead1Node1->m_pNext = pHead1Node2;
	pHead1Node2->m_pNext = pHead1Node3;
	pHead1Node3->m_pNext = pHead1Node4;
	pHead1Node4->m_pNext = NULL;

	ListNode* pHead2 = new ListNode();
	ListNode* pHead2Node1 = new ListNode();
	pHead2->m_nKey = 4;
	pHead2Node1->m_nKey = 5;
	pHead2->m_pNext = pHead2Node1;
	pHead2Node1->m_pNext = pHead1Node3;

	ListNode* result = FindFirstCommonNode(pHead1, pHead2);
	printf("result = %d\n", result->m_nKey);

    return 0;
}

输出:

result = 6

编程算法 - 两个链表的第一个公共结点 代码(C),布布扣,bubuko.com

时间: 2024-10-27 08:29:17

编程算法 - 两个链表的第一个公共结点 代码(C)的相关文章

两个链表的第一个公共结点(剑指offer)+链表

两个链表的第一个公共结点 参与人数:1171时间限制:1秒空间限制:32768K 通过比例:31.25% 最佳记录:0 ms|0K(来自  running) 题目描述 输入两个链表,找出它们的第一个公共结点. 链接:http://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46?rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

两个链表的第一个公共结点-剑指Offer

两个链表的第一个公共结点 题目描述 输入两个链表,找出它们的第一个公共结点. 思路 若用暴力比较,一个个的节点比较,时间复杂度为O(n2),不可取 根据题意,两个链表若有公共节点,最终要连起来,像一个Y形,所以我们从后往前遍历,但是单向链表只能从前往后,所以这符合“先进后出”,可以用两个辅助栈 也可以不用辅助栈,我们先将两个链表遍历一遍,获取长度大小,然后从长的先开始遍历,到达相等长度后同时开始遍历,直到遍历到相等的节点 这个问题可以类比到求二叉树中两个叶结点的最低公共祖先的问题 代码 /* p

剑指offer (37) 两个链表的第一个公共结点

题目:输入两个链表,找出它们的第一个公共结点 如果两个链表有公共结点,那么公共结点一定出现在两个链表的尾部 如果两链表长度不相等,那么达到公共结点的步数就不一致,如何确保 两个链表从头开始遍历,同步达到公共结点? 这是关键所在 如果两链表长度相同,那么就可以同步达到了? 由此,我们就需要 让两个链表长度"相等" 我们假设 两链表长度分别为m和n,且m > n, 那么我们可以在较长链表中 先走 m - n 步,然后 两个链表游标同步走,如果有公共结点,那么就一定同时达到 ListN

【剑指offer】两个链表的第一个公共结点

转载请注明出处:http://blog.csdn.net/ns_code/article/details/26097395 简单题,剑指offer上的第37题,九度OJ上AC. 题目描述: 输入两个链表,找出它们的第一个公共结点. 输入: 输入可能包含多个测试样例.对于每个测试案例,输入的第一行为两个整数m和n(1<=m,n<=1000):代表将要输入的两个链表的元素的个数.接下来的两行,第一行为第一个链表的所有元素,中间用空格隔开.第二行为第二个链表的所有元素,中间用空格隔开. 输出: 对应

剑指offer七:两个链表的第一个公共结点

输入两个链表,找出它们的第一个公共结点. import java.util.*; public class Solution { public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) { ListNode current1 = pHead1; ListNode current2 = pHead2; HashMap<ListNode,Integer> hashMap = new HashMap<ListN

两个链表的第一个公共结点

题目描述 输入两个链表,找出它们的第一个公共结点. 首先遍历俩个链表得到它们的长度,以及长的链表多几个结点.在第二次遍历的时候,在较长的链表先走长度之差步,接着再同时在俩个链表遍历,找到的第一个相同的结点就是她们的第一个公共结点 /* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } };*/ class Solution { public: int length(

【链表】两个链表的第一个公共结点

输入两个链表,找出它们的第一个公共结点. 1 public class Solution { 2 3 /** 4 * 思路:两个链表相交,存在公共的链表尾,根据链表长度的差值,移动指针,找到第一个相同的节点,即为第一个公共节点 5 * @param pHead1 6 * @param pHead2 7 * @return 8 */ 9 public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) { 10 11 if

37.两个链表的第一个公共结点

题目:输入两个链表,找出它们的第一个公共结点,链表结点定义如下: struct  ListNode {          int m_nKey;          ListNode*  m_pNext; }; ListNode* FindFirstComonNode(ListNode* pHead1, ListNode* pHead2) { //得到两个链表的长度 unsigned int nLength1 = GetListLength(pHead1); unsigned int nLengt

剑指offer(四十四)之两个链表的第一个公共结点

题目描述 输入两个链表,找出它们的第一个公共结点. 思路分析:将其中一个链表结点,存进HashMap中,将利用ContainsKey()进行判断是否有公共结点 代码1: <span style="color:#6600cc;">import java.util.*; public class Solution { public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) { ListNode