21.哀家要长脑子了!

目录

1.21. 合并两个有序链表 - 力扣(LeetCode)

2.86. 分隔链表 - 力扣(LeetCode)

3.141. 环形链表 - 力扣(LeetCode)

4.876. 链表的中间结点 - 力扣(LeetCode)


1.21. 合并两个有序链表 - 力扣(LeetCode)

 我做过啊,为什么还是不能独立做出来,为什么为什么啊啊啊 嘻嘻奔向五一

是这样的:

要按升序连接,以链表2头结点作为开端,哪个小就先连接哪个,然后把此时操作的链表的指针往后移,同时遍历新链表的指针也要往后移

class Solution {
public:
    ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
        ListNode *head = new ListNode(0);
        ListNode *p = head;
        while(list1 && list2){
            // 如果list2的元素大于list1的元素,就先把list1的元素加入到新链表中
            if(list2->val > list1->val){
                p->next = list1;
                list1 = list1->next;
            }
            else{
            // 如果list2的元素小于等于list1的元素,就先把list2的元素加入到新链表中
                p->next = list2;
                list2 = list2->next;
            }
            p = p->next;
        }
        // 因为两个链表都是有序的,谁先遍历完了,另一个没有遍历玩的直接全部接上去就好
        p->next = list1 ? list1: list2;
        return head->next;
    }
};
2.86. 分隔链表 - 力扣(LeetCode)

这个思路是这样的,把大于x的元素放在一个链表中名为large,把小于x的元素放在一个链表中,名为small,等到最后题目给出的链表遍历完了,把large接到small的后面返回。

class Solution {
public:
    ListNode* partition(ListNode* head, int x) {
        ListNode *smallHead = new ListNode(0);    
        ListNode *small = smallHead;
        ListNode *largeHead = new ListNode(0);
        ListNode *large = largeHead;
        while(head){
            if(head->val < x){
                small->next = head;
                small = small->next;
            }
            else{
                large->next = head;
                large = large->next;
            }
            head = head->next;
        }
        large->next = nullptr;
        small->next = largeHead->next;
        return smallHead->next;
    }
};
3.141. 环形链表 - 力扣(LeetCode)

 

是环形链表2的简化

可以想象成龟兔赛跑,在一个链表中,兔子每次走两步,乌龟每次走一步。如果这个链表没有环的话,那么乌龟兔子最后肯定都会走到空指针,并且兔子先走到。如果这个链表有环的话,那么兔子先进入环中,不断地绕环走绕环走,肯定会等到乌龟进入环中并且相遇。这时候兔子就说:因为我知道你会来,所以我等。哈哈哈哈哈哈哈哈哈哈哈哈哈哈

class Solution {
public:
    bool hasCycle(ListNode *head) {
        ListNode *fast = head;
        ListNode *slow = head;
        while(fast && fast->next){
            if(slow == nullptr || fast == nullptr){
                return false;
            }
            fast = fast->next->next;
            slow = slow->next;
        }
        return true;
    }
};

 fast->next检查也是为在fast移动两步之前,确保下一步是安全的。

4.876. 链表的中间结点 - 力扣(LeetCode)

 求链表长度,首位相连,定位,返回。

class Solution {
public:
    ListNode* middleNode(ListNode* head) {
        int len = 1;
        ListNode *p = head;
        while(p->next){
            len++;
            p = p->next;
        }
        // 跳出循环时,p指向的是链表的最后一个结点的下一个结点,而不是最后一个结点
        p = head;
        // 要定位到断开结点的前一个结点 类似于删除
        int mid = 0;
        while(mid < n / 2){
            mid++;
            p = p->next;
        }
        return p;      
    }
};

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-04 13:52:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-04 13:52:01       106 阅读
  3. 在Django里面运行非项目文件

    2024-05-04 13:52:01       87 阅读
  4. Python语言-面向对象

    2024-05-04 13:52:01       96 阅读

热门阅读

  1. 输入序列太长 gan CGAN

    2024-05-04 13:52:01       28 阅读
  2. Spring Bean Scope

    2024-05-04 13:52:01       38 阅读
  3. 网络工程师----第十九天:

    2024-05-04 13:52:01       37 阅读
  4. Python爬虫:线程,进程与协程

    2024-05-04 13:52:01       34 阅读
  5. HttpUtil的定义

    2024-05-04 13:52:01       31 阅读
  6. 【代码随想录】day50

    2024-05-04 13:52:01       34 阅读
  7. Redis rehash 相关问题

    2024-05-04 13:52:01       37 阅读