力扣每日刷题 141. 环形链表 136. 只出现一次的数字 160. 相交链表

力扣每日刷题 141. 环形链表 136. 只出现一次的数字 160. 相交链表,第1张

仅作为个人方法记录,不涉及详细思路解析,请各位看官海涵!

三道标签都为简单。

141. 环形链表

这题就是给个链表判断里面是否有环。记录一个新方法:快慢指针。快指针在前面快快走,满指针在后面慢慢走,如果快指针追上了慢指针代表存在环。

class Solution {
public:
    bool hasCycle(ListNode* head) {
        if (head == nullptr || head->next == nullptr) {
            return false;
        }
        ListNode* slow = head;
        ListNode* fast = head->next;
        while (slow != fast) {
            if (fast == nullptr || fast->next == nullptr) {
                return false;
            }
            slow = slow->next;
            fast = fast->next->next;
        }
        return true;
    }
};
136. 只出现一次的数字

这题就是在一个数组里找到唯一的只出现过一次的数字。记录一个新方法,异或。

自己^自己=0;        自己^0=自己

class Solution {
public:
    int singleNumber(vector& nums) {
        int ret = 0;
        for (auto e: nums) ret ^= e;
        return ret;
    }
};
 160. 相交链表

做这题的时候忽略了一个点,就是一个结点相交它之后的结点就都是相交的,所以当时没考虑哈希表,想的是将两个链表控制到同样的长度(长的链表截去前面长出来的部分),然后遍历就行了。当然哈希表做法思路也很简单,这里记录一个官方做法,与上面的快慢指针有些类似,也是循环遍历直至两个链表遍历到相同的结点(第一个相交结点)或者都遍历到尾部(null)。

class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        if (headA == nullptr || headB == nullptr) {
            return nullptr;
        }
        ListNode *pA = headA, *pB = headB;
        while (pA != pB) {
            pA = pA == nullptr ? headB : pA->next;
            pB = pB == nullptr ? headA : pB->next;
        }
        return pA;
    }
};

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/734945.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-27
下一篇 2022-04-27

发表评论

登录后才能评论

评论列表(0条)

保存