题目描述:
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
题解思路:
1、如果list1 链表为空,那么返回 list2 链表,list2为空 同理
2、先找到小的链表的头cur1,另一个链表的头cur2。同时创建一个List集合用来存储元素节点
3、循环遍历这两个链表,如果cur1 和 cur2 节点的值相等,就将两个节点的值同时放入到 ArrayList,同时指针向后移动、cur2链表的值大于第一个链表的值的时候,将链表1的值放入到ArrayList中,链表cur1的指针向后移、cur1链表的值大于第一个链表的值的时候,将链表cur2的值放入到ArrayList中,链表cur2的指针向后移
4、如果cur1 == null 或者是 cur2 == null ,则退出循环,然后将cur1中剩下的元素或者cur2中剩下的元素放入到List集合中。
5、最后准备一个临时的节点,然后将集合中的元素一个一个的穿起来。
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
if (list1 == null){
return list2;
}
if (list2 == null){
return list1;
}
//找到小列表的头,如果头节点相等的话则默认是 list1
ListNode cur1 = list1.val <= list2.val?list1:list2;
ListNode cur2 = cur1 == list1?list2:list1;
//借用ArrayList用来存储节点元素
List<ListNode> element = new ArrayList<>();
ListNode next1 = null;
ListNode next2 = null;
//开始遍历这两个链表
while(cur1!=null && cur2!=null){
//如果两个节点的值相等,就将两个节点的值同时放入到 ArrayList,同时指针向后移动
if (cur1.val == cur2.val){
next1 = cur1.next;
next2 = cur2.next;
cur1.next = null;
cur2.next = null;
element.add(cur1);
element.add(cur2);
cur1 = next1;
cur2 = next2;
}
//第二个链表的值大于第一个链表的值的时候,将链表1的值放入到ArrayList中,链表1的指针向后移动
else if (cur1.val < cur2.val){
next1 = cur1.next;
cur1.next = null;
element.add(cur1);
cur1 = next1;
}
//同理
else if (cur1.val > cur2.val){
next2 = cur2.next;
cur2.next = null;
element.add(cur2);
cur2 = next2;
}
}
//如果链表1不为空,则吧剩下的元素放入到ArrayList中去
while (cur1!=null){
next1 = cur1.next;
cur1.next = null;
element.add(cur1);
cur1 = next1;
}
//同理
while(cur2!=null){
next2 = cur2.next;
cur2.next = null;
element.add(cur2);
cur2 = next2;
}
//准备一个临时的节点,然后将ArrayList里面的节点一个一个的串起来他们
ListNode tempNode = new ListNode();
ListNode temp = tempNode;
for (int i=0;i<element.size();i++){
tempNode.next = element.get(i);
tempNode = tempNode.next;
}
return temp.next;
}
解题思路2:
1、找到小的头
2、保存小头的下一个元素 记作 cur1 = head.next,同时需要找到cur2
3、准备一个变量pre,让他指向pre
4、在cur!=null && cur!=null的前提下开始做循环操作,如果cur1.val <= cur2.val此时pre.next = cur1,cur1 = cur1.next 否则 pre.next = cur2; cur2 = cur.next; , pre这个指针向侯移动一步,此时就将两个链表依次压倒一个链表中去了
5、最后pre.next 链接上剩下的元素 cur1 或者 cur2 。然后返回 head
ListNode head = head1.val <= head2.val ? head1 : head2;
ListNode cur1 = head.next;
ListNode cur2 = head == head1?head2:head1;
ListNode pre = head;
while(cur1!=null && cur2!=null){
if (cur1.val <= cur2.val){
pre.next = cur1;
cur1 = cur1.next;
}else{
pre.next = cur2;
cur2 = cur2.next;
}
pre = pre.next;
}
pre.next = cur1!=null?cur1:cur2;
return head;
}