剑指offer25-合并两个排序的链表

76 篇文章 1 订阅

问题描述

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

示例1:

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

限制:

0 <= 链表长度 <= 1000

解题思路

本题与普通数组的归并十分相似,根据题目描述,两个链表l1,l2是递增的,因此很容易想到使用双指针l1和l2来遍历两个链表,根据双指针所指向的l1.val和l2.val的大小关系确定添加结点的顺序,当l1.val更小时,合并的链表中添加l1中的结点,当l2.val更小时,合并的链表中添加l2中的结点。当满足l1和l2有一个链表遍历完了之后,那么另外一个没有遍历完的链表就直接连接即可(注意,这里与数组的归并算法不同,数组中剩余一个链表需要一个一个的拷贝到新数组中,而链表直接用next指针指向即可)。
注意:这里有一个关键点是对于新的合并的链表,一定要定义一个不带任何数据的头结点
在这里插入图片描述

实现代码

public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        ListNode head=new ListNode(-1);         //定义头结点
        ListNode p=l1;
        ListNode q=l2;                  //定义双指针
        ListNode r=head;                //定义新的链表的指针      
        while(p!=null && q!=null){      //当其中一个链表遍历完了,退出循环
            if(p.val<q.val){            //双指针选择最小的元素添加到新链表中
                r.next=p;
                p=p.next;
            }else{
                r.next=q;
                q=q.next;
            }
            System.out.println(r.val);
            r=r.next;
        }
        if(p!=null){                    //当还有一个链表没有遍历完时,直接连接即可。
            r.next=p;
        }
        if(q!=null){
            r.next=q;
        }
        return head.next;
    }
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值