题目
题号:16
题目名:合并两个排序的链表
编程语言
Java
题目描述
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
初次思路
可以使用额外空间,也可以使用在原地修改的
这里使用在原地修改
首先定位首位小的为主,大的为副分支,目的是将副分支合并到主分支上
双指针遍历主副分支,如果主小于等于副,那么继续遍历,否则将副分支的结点插入,再后移,这里为了处理插入方便,添加一个主分支前置遍历指针
解题代码
public class Solution {
public ListNode Merge(ListNode list1, ListNode list2) {
//非空校验
if (list1 == null && list2 == null) return null;
if (list1 == null || list2 == null) return list1 == null ? list2 : list1;
/**
* 归并后要完成排序
* 1.找到数字小的一端作为合并段
* 2.设置两个指针对两个链表遍历,如果合并段大于另一段,就将另一段的结点插入,否则继续遍历
* 3.有一个遍历完了就将领一个接在最后
*/
ListNode merge = null;//主合并
ListNode mergeTo = null;//被合并
merge = list1.val<list2.val?list1:list2;
mergeTo = list1.val<list2.val?list2:list1;
ListNode curr1 = merge;//主合并遍历指针
ListNode curr2 = mergeTo;//副合并遍历指针
ListNode preCurr1 = curr1;//curr1前置,方便插入
curr1=curr1.next;//curr1前置,方便插入
while(curr1!=null&&curr2!=null) {
//如果主合并小于等于分支,那么直接后移,不用将分支合并
if(curr1.val<=curr2.val) {
curr1 = curr1.next;
preCurr1 = preCurr1.next;
}else {
//否则要将分支插入到主合并
mergeTo = mergeTo.next;
preCurr1.next = curr2;
curr2.next = curr1;//插入完成
preCurr1=preCurr1.next;
curr2=mergeTo;
}
}
//如果主分支为空,副分支有剩余,直接拼在主分支上,否则说明副分支拼完了
if(curr1==null) preCurr1.next=mergeTo;
return merge;
}
}