LeetCode 链表 24 19 160 142

Leetcode 24 Swap Nodes in Pairs

    ListNode* swapPairs(ListNode* head) {
        ListNode *dummyNode = new ListNode(0);
        dummyNode->next = head;
        ListNode *orig = dummyNode;
        ListNode *pre = head;
        if(pre == NULL ||pre ->next == NULL){
            return pre;
        }
        ListNode *cur = pre->next;
        while(cur != NULL){
            ListNode *tmp = cur->next;
            cur->next = pre;
            pre->next = tmp;
            orig->next = cur;
            if(tmp == NULL)break;
            pre = tmp;
            cur = tmp->next;
            orig = orig->next->next;
        }

        return dummyNode->next;
    }

指针法:

用了三个指针,分别指向两个相邻的元素和前一组相邻元素的后一个元素(第一次写的时候没有写怎么与前一组元素相连)相邻的两个交换位置,并与前一组相连

(递归法)

Leetcode 19 remove Nth Node From End of List

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode *dummy = new ListNode(0);
        dummy->next = head;
        ListNode *fast = dummy;
        ListNode *low = dummy;
        for(int i = 0; i<n; i++){
            fast = fast->next;
        }
        while(fast->next != NULL){
            fast = fast->next;
            low = low->next;
        }
        ListNode *tmp = low->next;
        low->next = tmp->next;
        delete tmp;
        return dummy->next;
    }
};

有快慢两个指针,fast先走n步,然后两个指针同时前进,直到fast走到尽头

注意:

  1. fast需要走到末尾的值,而不是直接到NULL,这样low才是删除节点的前一个node

  1. 使用虚拟头节点

leetcode 160

class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        int Na = 0;
        int Nb = 0;
        ListNode *pa = headA;
        ListNode *pb = headB;
        while(pa != NULL){
            Na++;
            pa = pa->next;
        }
        while(pb != NULL){
            Nb++;
            pb = pb->next;
        }

        pa = headA;
        pb = headB;

        if(Na < Nb){
            swap(Na, Nb);
            swap(pa, pb);
        }

        int n = Na - Nb;
        while(n--){
            pa = pa->next;
        }
        while(pa!= NULL){
            if(pa == pb)
               return pa;
            pa = pa->next;
            pb = pb->next;
        }
        return NULL;
    }
};

同样设置两个指针,先算出两个链表的长度,再让长的链表的指针先走,使他们能够同时到达相交的节点

Leetcode142 Linked List Cycle2

class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        ListNode *slow = head;
        ListNode *fast = head;
        while(fast != NULL && fast->next != NULL){
            slow = slow->next;
            fast = fast->next->next;
            if(slow == fast)break;
        }
        if(fast ==NULL || fast->next == NULL){
            return NULL;
        }
        slow = head;
        while(slow != fast){
            slow = slow->next;
            fast = fast->next;
        }

        return slow;
    }
};

有快慢两个指针,快指针每次走两步,慢指针每次走一步,最后一定会在环内相遇。此时从环的起点到相遇点的距离是快慢指针一起走过的,假设距离为k,那么fast剩余在环内走过的步数也为y,所以当两个指针一个从起点出发,一个从相遇点出发,都以一步向前行进,一定可以在环的起点相遇

注意:要注意到无环的情况

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值