题目描述:将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
分析:
1.已知有两个链表 list1 和 list2 ,我们准备一个新链表 newHead
2.分别比较两个链表的结点,找出小的一个结点,把该结点放到新链表
3.完成之后让 cur 指向下一个结点
(以上,隐含两个链表中都有结点,放入新链表中尾插-(升序) )
4.考虑一个链表为空 一个链表不为空时,直接返回不为空的链表即可
分部实现:
1.设定好链表用到的结点
ListNode cur1 = list1; //链表1结点
ListNode cur2 = list2; //链表2结点
ListNode newHead = null; //新链表的头结点
ListNode newLast = null; //新链表的尾结点
2.实现分析4--一个链表为空 一个链表不为空时
if(list1 == null){ //链表1为空直接返回链表2
return list2;
}
if(list2 == null){ //链表2为空直接返回链表1
return list1;
}
3.两个链表都不为空时
while(cur1 != null && cur2 != null) {
if (cur1.val <= cur2.val) {
//当 cur1 结点小于 cur2 时
//取 cur1 的结点,尾插到 newHead 中
{
if (newHead == null) { //如果 newHead 为空,直接让 cur 的值给newHead即可
newHead = cur1;
} else {
newLast.next = cur1; //如果 newHead 不为空
//则让新链表最后一个结点的下一个的值为 cur
}
newLast = cur1;
}
cur1 = cur1.next; //cur 继续向后指进行比较
} else {
//当 cur2 结点小于 cur1 时
//取 cur2的结点,尾插到 newHead 中
{
if (newHead == null) {
newHead = cur2;
} else {
newLast.next = cur2;
}
newLast = cur2;
}
cur2 = cur2.next;
}
}
//如果 cur1 为空就让新链表的下一个结点指向 cur2
if(cur1 == null){
newLast.next = cur2;
}else{
//如果 cur2 为空就让新链表的下一个结点指向 cur1
newLast.next = cur1;
}
return newHead;
完整代码 :
class Solution {
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
if(list1 == null){
return list2;
}
if(list2 == null){
return list1;
}
ListNode cur1 = list1;
ListNode cur2 = list2;
ListNode newHead = null;
ListNode newLast = null;
while(cur1 != null && cur2 != null) {
if (cur1.val <= cur2.val) {
{
if (newHead == null) {
newHead = cur1;
} else {
newLast.next = cur1;
}
newLast = cur1;
}
cur1 = cur1.next;
} else {
{
if (newHead == null) {
newHead = cur2;
} else {
newLast.next = cur2;
}
newLast = cur2;
}
cur2 = cur2.next;
}
}
if(cur1 == null){
newLast.next = cur2;
}else{
newLast.next = cur1;
}
return newHead;
}
}