学习目标:
目标:熟练运用Java所学知识
学习内容:
本文内容:使用Java实现:合并两个排序的链表
题目描述:
输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。
示例1:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
解题思路:
将两个排序的链表合并成一个新的排序的链表,由于原链表是有序的,所以我们只需要按顺序遍历,比较两个链表每个数据的大小进行排序,放入新的链表,当连个数据相同时,随意放入一个数值即可
- 首先创建保存新的排序链表的新链表
ListNode cur1=l1;//用于遍历l1链表
ListNode cur2=l2;//用于遍历l2链表
ListNode newHead=new ListNode(0);//创建带傀儡的新链表,用于存放新的排序链表
ListNode newTail=newHead;//记录尾结点位置
- 排除某一个链表为空的情况
//判断两个链表是否都是空链表
if(cur1==null&&cur2==null){
return null;
}
//如果cur1为空,则返回l2链表
if(cur1==null){
return l2;
}
//如果cur2为空,则返回l1链表
if(cur2==null){
return l1;
}
- 比较两个链表数据的大小
while(cur1!=null&&cur2!=null){
//链表1的数据小于链表2的数据
if(cur1.val<cur2.val){
newTail.next=cur1;//将较小数据存放到新链表
cur1=cur1.next;//更新链表位置
}
//链表1的数据大于等于链表2的数据
else{
newTail.next=cur2;//将较小数据存放到新链表
cur2=cur2.next;//更新链表位置
}
newTail=newTail.next;
}
- 遍历结束之后,判断是否有某一个链表没有遍历完
//遍历结束之后,判断是否有某一个链表没有遍历完
if(cur1==null){
newTail.next=cur2;
}else{
newTail.next=cur1;
}
实现代码
public static ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode cur1=l1;
ListNode cur2=l2;
ListNode newHead=new ListNode(0);//创建带傀儡的新链表,用于存放新的排序链表
ListNode newTail=newHead;//记录尾结点位置
//判断两个链表是否都是空链表
if(cur1==null&&cur2==null){
return null;
}
//如果cur1为空,则返回l2链表
if(cur1==null){
return l2;
}
//如果cur2为空,则返回l1链表
if(cur2==null){
return l1;
}
//比较两个链表数据的大小
while(cur1!=null&&cur2!=null){
//链表1的数据小于链表2的数据
if(cur1.val<cur2.val){
newTail.next=cur1;//将较小数据存放到新链表
cur1=cur1.next;//更新链表位置
}
//链表1的数据大于等于链表2的数据
else{
newTail.next=cur2;//将较小数据存放到新链表
cur2=cur2.next;//更新链表位置
}
newTail=newTail.next;
}
//遍历结束之后,判断是否有某一个链表没有遍历完
if(cur1==null){
newTail.next=cur2;
}else{
newTail.next=cur1;
}
return newHead.next;
}