剑指offer—day 12(双指针-2)

1.剑指 Offer 25. 合并两个排序的链表【简单】

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

示例1:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4

创建新表:

ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {  //我的代码居然和孙笑川一模一样也是晦气了
    ListNode *head=new ListNode;  //别人管这个叫dummyHead
    ListNode *l=head;
    
    while(l1!=NULL && l2!=NULL){      //将两个表中较小的结点加入新的表中
        if(l1->val<l2->val){
            l->next=l1;
            l1=l1->next;
        }
        else{
            l->next=l2;
            l2=l2->next;
        }
        l=l->next;
    }

    if(l1!=NULL)    //将不是空的链表接上即可
        l->next=l1;
    else
        l->next=l2;
    return head->next;
}

递归:

ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {  
    if(l1==NULL)
        return l2;
    if(l2==NULL)
        return l1;
    if(l1->val<=l2->val){
        l1->next=mergeTwoLists(l1->next,l2);
        return l1;
    }
    else{
        l2->next=mergeTwoLists(l1,l2->next);
        return l2;
    }
}

\qquad

2.剑指 Offer 52. 两个链表的第一个公共节点【简单】

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

在这里插入图片描述

hash集合:
先把A的结点全部加入unordered_set里面,然后逐一判断B的结点并加入即可…O(n)

 ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
    if(headA==NULL || headB==NULL)
        return NULL;
    unordered_set<ListNode *> visited;
    ListNode *temp=headA;
    while(temp!=NULL){
        visited.insert(temp);  //插入集合中
        temp=temp->next;
    }
    temp=headB;
    while(temp!=NULL){
        if(visited.count(temp))   //若有,count返回1
            return temp;
        temp=temp->next;
    }
    return NULL;
}

浪漫解法:
m,n分别做模m的减法和模n的减法,指定一个数(相遇位置),m和n每次减一,多次以后,m与n会均为这个数,即相遇了?

ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
    if(headA==NULL || headB==NULL)
        return NULL;
    ListNode *p=headA,*q=headB;
    while(p!=q){
        p= p==NULL?headA:p->next;    //不断地遍历,多遍以后总会相遇
        q= q==NULL?headB:q->next;
    }
    return q;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值