其他分享
首页 > 其他分享> > 剑指offer刷题记录_Day12

剑指offer刷题记录_Day12

作者:互联网

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