IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> LeetCode160相交链表 -> 正文阅读

[数据结构与算法]LeetCode160相交链表

class Solution {
public:
	ListNode* getIntersectionNode(ListNode* headA, ListNode* headB) {
		stack<ListNode*>stA;
		stack<ListNode*>stB;
		if (headA == NULL || headB == NULL) {
			return NULL;
		}
		while (headA) {
			stA.push(headA);
			headA = headA->next;
		}
		while (headB) {
			stB.push(headB);
			headB = headB->next;
		}
		ListNode* result = NULL;
		if (stA.top() == stB.top()) {
			while (!stA.empty() && !stB.empty()) {
				ListNode* A = stA.top();
				stA.pop();
				ListNode* B = stB.top();
				stB.pop();

				if (A == B) {
					result = A;
				}
				else {
					return result;
				}
			}
			return result;
		}
		else {
			return NULL;
		}
		return NULL;
	}
};

解题思路

? 直接杀到链表的尾部,看一下两个链表的尾节点是不是相同,若相同说明必然有相交点,若不相同,可以直接返回null

若最后一个节点相等的话,怎么退回去呢?使用栈,最开始将两个链表分别压入栈中。依次弹出来比较,就可以了。弹得过程中保留上一个节点,若当前节点不相等,说明上一个节点就是相交节点。

代码细节

设置一个变量result保存弹栈元素相同时的值,若弹出来的两个节点相等,就更新result的值,若两个不相等,说明上一个节点就是相交节点,此时返回result即可。还有就是两个链表都只有一个元素,那么一次弹栈操作后,不会在进行弹栈操作,那么需要在循环之外返回result。

代码要考虑到所有出口的情况,不能发生遗漏;另一方面就是所有可能得输入都要考虑到位,不能只解决一直输入情况,可以先解决主要的情况,再将其他情况安插到代码中适当的位置

方法二 链表长度差值法

class Solution {
public:
	ListNode* getIntersectionNode(ListNode* headA, ListNode* headB) {
		if (headA == NULL || headB == NULL) {
			return NULL;
		}
		int countA = 0;
		int countB = 0;
		int k = 0;
		ListNode* preA = NULL;
		ListNode* preB = NULL;
		ListNode* headA1 = headA;
		ListNode* headB1 = headB;
		ListNode* result = NULL;
		while (headA1) {
			countA++;
			preA = headA1;
			headA1 = headA1->next;
		}
		while (headB1) {
			countB++;
			preB = headB1;
			headB1 = headB1->next;
		}
		if (preA != preB) {
			return NULL;
		}
		if (countA <= countB) {
			k = countB - countA;
			cout << k << endl;
			while (k--) {
				headB = headB->next;
			}
			while (headA) {
				if (headA == headB) {
					return headA;
				}
				headA = headA->next;
				headB = headB->next;
			}

		}
		else {
			k = countA - countB;
			cout << k << endl;
			while (k--) {
				headA = headA->next;
			}
			while (headB) {
				if (headA == headB) {
					return headB;
				}
				headA = headA->next;
				headB = headB->next;
			}
		}
		return NULL;
	}
};

思路

遍历两个链表,获得两者的长度,作差后得到k,将长的链表先走k个元素,再将两个链表逐节点比较

方法三 哈希表

class Solution {
public:
	ListNode* getIntersectionNode(ListNode* headA, ListNode* headB) {
		set<ListNode*>setA;
		if (headA == NULL || headB == NULL) {
			return NULL;
		}
		while (headA) {
			setA.insert(headA);
			headA = headA->next;
		}
		while (headB) {
			if (setA.find(headB) != setA.end()) {
				return headB;
			}
			else {
				headB = headB->next;
			}
		}
		return NULL;
	}
};

思路

set中不允许有重复的内容,所以先将一个链表中的节点加入进去,再用另一个链表中的元素在set中查找,若能找到,说明有交点,若找不到说明没有交点。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-07-16 11:33:17  更:2021-07-16 11:34:47 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 17:29:12-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码