每日算法题【链表】:链表的中间节点、返回倒数第k个节点、合并两个有序链表

(8) 返回链表的中间节点
  • [876. 链表的中间结点 - 力扣(LeetCode)]:

  • 解题思路:

    使用快慢指针,快指针走两步,慢指针走一步,快指针指向空,慢指针所指向的节点就是中间节点

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     struct ListNode *next;
     * };
     */
    
     //使用快慢指针,快指针走两步,慢指针走一步,快指针指向空,慢指针所指向的节点就是中间节点
    struct ListNode* middleNode(struct ListNode* head) {
        //定义两个指针
        struct ListNode* fast = head;
        struct ListNode* slow = head;
        //循环条件判断:fast->next不能放在前面,因为如果链表是偶数个节点,fast最后一次会直接走到空
        while(fast && fast->next){
            slow = slow->next;
            fast = fast->next->next;
        }
        return slow;
    }
    

(9)输入一个链表,输出该链表中倒数第k个结点
  • [面试题 02.02. 返回倒数第 k 个节点 - 力扣(LeetCode)]:

  • 解题思路:

    定义两个前后指针,之间相差k步,当后指针指为空的时候,前指针所指向的节点就是目标节点。

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     struct ListNode *next;
     * };
     */
    //定义两个前后指针,之间相差k步,当后指针指为空的时候,前指针所指向的节点就是目标节点。
    
    int kthToLast(struct ListNode* head, int k) {
        struct ListNode *first = head;
        struct ListNode *last = head;
    
        // 先让last向前移动k步
        for (int i = 0; i < k; i++) {
            if (last == NULL) {
                return -1; // 处理k大于链表长度的情况
            }
            last = last->next;
        }
    
        // 然后first和last一起移动,直到last为NULL
        while (last != NULL) {
            first = first->next;
            last = last->next;
        }
    
        return first->val;
    }
    

(10)合并两个有序链表
  • [21. 合并两个有序链表 - 力扣(LeetCode)]:

  • 解题思路:

    循环遍历比较两个链表,谁小谁就尾插到新链表当中,谁尾插谁加加,最后再判断一下有没有没比的,全放在新链表的最后

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     struct ListNode *next;
     * };
     */
    struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {
        // 创建一个虚拟头节点
        struct ListNode dummy;
        struct ListNode* tail = &dummy;
        dummy.next = NULL;
    
        // 循环遍历比较
        while(list1 && list2){
            if(list1->val < list2->val){
                tail->next = list1;
                list1 = list1->next;
            } else {
                tail->next = list2;
                list2 = list2->next;
            }
            tail = tail->next;
        }
    
        // 连接剩余节点
        if(list1 != NULL){
            tail->next = list1;
        } else {
            tail->next = list2;
        }
    
        return dummy.next;
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值