【LeetCode160】-相交链表

方法一(栈):

实现思路

分别遍历两个链表,将链表的节点指针压入栈中,然后依次比对两个栈的栈顶元素,相同则将该节点保存在变量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)

总结

总体看下来还是方法三最简单,没有那些冗余不必要的操作,就是需要多实现两个小函数

猜你喜欢

转载自blog.csdn.net/weixin_44944046/article/details/112952792