方法一(栈):
实现思路
分别遍历两个链表,将链表的节点指针压入栈中,然后依次比对两个栈的栈顶元素,相同则将该节点保存在变量t中,并弹栈,直到栈为空或者栈顶元素不相同时,停止对栈的操作,返回变量t的值为结果
实现代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
stack<ListNode*> s1;
stack<ListNode*> s2;
while(headA!=nullptr){
s1.push(headA);
headA=headA->next;
}
while(headB!=nullptr){
s2.push(headB);
headB=headB->next;
}
ListNode *t=nullptr;
while(1){
if(s1.empty()||s2.empty()) break;
if(s1.top()==s2.top()){
t=s1.top();
s1.pop();
s2.pop();
}
else{
break;
}
}
return t;
}
};
提交结果及分析
空间复杂度O(n)
时间复杂度O(n)
方法二(Set集合):
实现思路
TIP:判断一元素是否在set中使用.find(x)!=.end()判断
实现代码
分析
由于使用了set集合这一数据结构
时间复杂度O(n log(n)),空间复杂度为O(n)
方法三
实现思路
总结起来是将不同长度的链表进行对齐,对齐后同时遍历,遍历到第一个相同的元素,就是我们所要的结果
实现代码
分析
时间复杂度O(n),空间复杂度O(1)
总结
总体看下来还是方法三最简单,没有那些冗余不必要的操作,就是需要多实现两个小函数