其他分享
首页 > 其他分享> > 剑指offer25-合并两个排序的链表

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

作者:互联网

问题描述

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

示例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;
    }

标签:ListNode,val,offer25,next,链表,l2,l1,排序
来源: https://blog.csdn.net/qq_39736597/article/details/113788759