ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

剑指offer刷题记录_Day12

2022-02-03 10:31:03  阅读:141  来源: 互联网

标签:ListNode headA offer next 链表 headB Day12 l1 刷题


Day12 双指针(简单)

Q1 合并两个排序的链表

输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {        
        if (l1 == nullptr) return l2;
        else if (l2 == nullptr) return l1;

        ListNode *head = new ListNode(0);
        ListNode* p = head;
        
        while(l1 && l2)
        {   
            if(l1->val < l2->val)
              {  p->next = l1;
                 l1 = l1->next;
                 p = p->next;}
            else{
                 p->next = l2;
                 l2 = l2->next;
                 p = p->next;}
            }

        if (l1) p->next = l1;
        else p->next = l2;

        return head->next;
    }
};

Q2 两个链表的第一个公共节点

输入两个链表,找出它们的第一个公共节点。

主要思路: 先计算两个链表的长度,求差,利用差值使两个链表尾部对齐,从较短的链表头部位置开始遍历判断

当然,本题还有更加简洁的解法,使用两个指针 node1,node2 分别指向两个链表 headA,headB 的头结点,然后同时分别逐结点遍历,当 node1 到达链表 headA 的末尾时,重新定位到链表 headB 的头结点;当 node2 到达链表 headB 的末尾时,重新定位到链表 headA 的头结点。当它们相遇时,所指向的结点就是第一个公共结点。

剑指 Offer 52. 两个链表的第一个公共节点(双指针,清晰图解) - 两个链表的第一个公共节点 - 力扣(LeetCode) (leetcode-cn.com)

/**
 * 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) {

        int m=0,n=0;
        
        ListNode *q = headA,*p = headB;
        while(q!=nullptr)
        {
            q = q->next;
            m++;
        }
        while(p!=nullptr)
        {
            p = p->next;
            n++;
        }
        if(m==0||n==0) return nullptr;

        int d = abs(m-n);
        q = m>n ? headA : headB; 
        p = m>n ? headB : headA; 
        for(int i=0;i<d;i++)
             q = q->next;        
        while(p&&q)
        {
            if(q == p) return q;
            else{
                p = p->next;
                q = q->next;
            }
        }
        return nullptr;
    }
};

简洁:

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

标签:ListNode,headA,offer,next,链表,headB,Day12,l1,刷题
来源: https://blog.csdn.net/Yangbos_/article/details/122774402

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有