LeetCode160相交链表
2021/7/15 23:15:14
本文主要是介绍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中查找,若能找到,说明有交点,若找不到说明没有交点。
这篇关于LeetCode160相交链表的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-23DevExpress 怎么实现右键菜单(Context Menu)显示中文?-icode9专业技术文章分享
- 2024-12-22怎么通过控制台去看我的页面渲染的内容在哪个文件中呢-icode9专业技术文章分享
- 2024-12-22el-tabs 组件只被引用了一次,但有时会渲染两次是什么原因?-icode9专业技术文章分享
- 2024-12-22wordpress有哪些好的安全插件?-icode9专业技术文章分享
- 2024-12-22wordpress如何查看系统有哪些cron任务?-icode9专业技术文章分享
- 2024-12-21Svg Sprite Icon教程:轻松入门与应用指南
- 2024-12-20Excel数据导出实战:新手必学的简单教程
- 2024-12-20RBAC的权限实战:新手入门教程
- 2024-12-20Svg Sprite Icon实战:从入门到上手的全面指南
- 2024-12-20LCD1602显示模块详解