怎么判断两个链表是否有merge?如果有:在哪?

Abstact

刷OJ时,遇到一个题:判断两个链表是否有merge?如果有?在哪?如下图:merge point在值为3的地方。
在这里插入图片描述
在StackOverflow上一个回答特别棒:check if two linked lists merge
现在记录下来。

Algorithm

算法很简单:同时遍历两个链表。设右边为current1(对应第一条链表),current2(对应第二条链表)。当current1到尽头后,使current1遍历第二条链表。同样当current2到尽头后:使其遍历第一条链表。
在第二次遍历时:current1==current2:此时是merge point。否则没有merge point。

Why

在这里插入图片描述

Implement

int findMergeNode(SinglyLinkedListNode* head1, SinglyLinkedListNode* head2) {
    SinglyLinkedListNode* current1=head1,*current2 = head2;   
    while(current1 !=current2){
        if(current1->next ==nullptr)
            current1=head2;
        else
            current1=current1->next;
        if (current2->next == nullptr)
          current2 = head1;
        else
          current2 = current2->next;
    }
    return current1->data;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在JAVA中,可以使用MergeNode类来合并两个有序链表成为一个有序链表,并且有一个头节点。 首先,创建一个MergeNode类,其中包含了向链表中顺序添加节点和打印链表的方法。在这个类中,有一个头节点head,用来指向合并后的链表的头部。 接着,在MergeNode类中添加一个合并两个有序链表的方法merge,该方法接受两个头节点head1和head2作为参数。首先判断head1和head2是否为空,如果其中一个为空,则直接返回另一个头节点。然后,创建一个新的头节点headNode和尾节点last,并根据头节点的值的大小来确定头节点和尾节点的初始值。接下来,使用while循环遍历两个链表,比较头节点的值的大小,将较小的节点添加到合并链表的尾部,并更新相应的指针。当其中一个链表为空时,将另一个链表的剩余部分直接添加到合并链表的尾部。最后,返回合并链表的头节点headNode的下一个节点即可。 需要注意的是,合并链表的头节点是随意初始化的,所以真正合并后的链表头节点应该是当前头节点的next。 通过使用MergeNode类中的addByOrder方法可以向链表中顺序添加节点,使用printNodeList方法可以打印链表的内容。以上是将两个有序链表合并为一个有序链表并且有头节点的JAVA实现。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [JAVA 将两个有序链表合并为一个有序链表](https://blog.csdn.net/Sundy_sc/article/details/107719345)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值