剑指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