LeetCode 160. 相交链表 题解 三种方法 C/C++

主要思路

方法一:用栈
将链表a和链表b都存入栈中
如果刚开始栈顶元素就不同说明没有相交
然后依次出栈,直到栈顶元素不相同时,即最后弹出栈顶的元素即为相交的起始节点

方法二 哈希表 set
将链表a插入到集合中,然后顺序遍历链表b,如果集合中已经存在该元素说明就是相交的起始节点
反之,没有相交

方法三 双指针法
定义一个指针指向链表a,另一个指针链表b
两个指针一起走,当指向链表a的指针到达尾部时,将它指向链表b的头结点;
同理,当指向链表b的指针到达尾部时,将它指向链表a的头结点
如果某一时刻两个指针相等说明就是相交的结点(也包括最后的nullptr,就是不相交),这个可以手动模拟一下


struct ListNode {
	int val;
	ListNode *next;
	ListNode():val(0),next(nullptr){}
	ListNode(int x):val(x),next(nullptr){}
	ListNode(int x,ListNode *next):val(x),next(nullptr){}

};

//方法一 用栈
/*
将链表a和链表b都存入栈中
如果刚开始栈顶元素就不同说明没有相交
然后依次出栈,直到栈顶元素不相同时,即最后弹出栈顶的元素即为相交的起始节点
*/
class Solution {
public:
	ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
		if(!headA || !headB)return nullptr;
		ListNode *curA = headA;
		ListNode *curB =headB;
		stack<ListNode *> staA,staB;
		while(curA) {
			staA.push(curA);
			curA = curA->next;
		}
		while(curB) {
			staB.push(curB);
			curB = curB->next;
		}
		if(staA.top() !=staB.top())return nullptr;
		ListNode *tmp = nullptr;
		while(!staA.empty()&&!staB.empty()&&staA.top()==staB.top()) {
			tmp = staA.top();
			staA.pop();staB.pop();
		}
		return tmp;


	}
};

//方法二:哈希表  set
/*
将链表a插入到集合中,然后顺序遍历链表b,如果集合中已经存在该元素说明就是相交的起始节点
反之,没有相交
*/
class Solution {
public:
	ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
		if(headA==nullptr||headB==nullptr)return nullptr;
		ListNode *curA = headA;
		ListNode *curB = headB;
		set<ListNode *> setList;
		while(curA!=nullptr) {
			setList.insert(curA);
			curA = curA->next;
		}

		while(curB) {
			if(setList.count(curB)) return curB;
			curB = curB->next;
		}
		return nullptr;


	}
};


//双指针法
/*
定义一个指针指向链表a,另一个指针链表b
两个指针一起走,当指向链表a的指针到达尾部时,将它指向链表b的头结点
同理,当指向链表b的指针到达尾部时,将它指向链表a的头结点
如果某一时刻两个指针相等说明就是相交的结点(也包括最后的nullptr,就是不相交)

*/
class Solution {
public:
	ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
		if(headA==nullptr||headB==nullptr)return nullptr;
		ListNode *curA = headA;
		ListNode *curB = headB;
		while(curA!=curB) {
			if(curA==nullptr) {//curA到达尾部后指向链表b头结点
				curA = headB;
			}
			else {
				curA = curA->next;
			}

			if(curB==nullptr) {
				curB = headA;
			}
			else {
				curB = curB->next;
			}

		}
		return curA;

	}
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值