难度:简单
频率:151
题目:
将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
解题方法1:链表操作(迭代。蠢办法)
解题思路:
1.两个指针,分别指向表头。再有一个指针1,空表头。
2.两个指针分别比较大小,小的进行操作。
3.先将空表头的指针1指向小的,然后指向小的指针指向下一个节点。
4.再判断 两个节点,小的再进行操作
5.再将指针1指向小的,然后指向小的指针指向下一个节点。
6.判断两个指针是否都不为空,如果是,继续4操作。
7.跳出6即说明 两个指针有一为空,或者二为空
进行判断,将不为空的指针接到新链表后面即可。
以上每个循环操作都有35操作的指针移动,所以其实可以把这个放在共同部分。不需要放在不同的if里,冗余。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
ListNode new_head=new ListNode(-1); //创建一个新节点。
ListNode p=new_head; //节点指针 p 指向 new_head。
while(list1!=null&&list2!=null)
{
if(list1.val<=list2.val){
p.next=list1; //p.next=list1代表的是将list1节点挂在p节点后面。
//上面的操作是连接,但没有移动指针P。
list1=list1.next;
}else{
p.next=list2;
list2=list2.next;
}
p=p.next;
}
if(list1!=null)
{
p.next=list1;
}
else if(list2!=null){
p.next=list2;
}
return new_head.next;
}
}
解题办法2:递归
解题思路:
递归:其实是一种逆问题思维,本来解决问题是从头到尾,但是现在发现从后面到前面也可以,而且可以最后一步更简单。这种往往可以用递归。重点是最后一步相当简单 然后 最后第二步能够最后一步联系起来,而且这种联系跟本身函数相关。。
从简单到复杂
1.判断list1是否为null,如果为空,返回list2;
2.如果list1不为空,接着判断list2是否为空,如果为空,返回list1;
上面两步就是说,如果list1和list2不同时为空,那么就返回不为空的那个就行了。
3.如果list1和list2都不为空,那就判断哪个头节点小,头节点小,把头节点弄出来,就把头节点放在,再调用函数判断后面的大小。【这里明显是为了变简单,也就把头节点放在最前面】
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
if(list1==null)
{
return list2;
}
else if(list2 == null)
{
return list1;
}
else if(list1.val<=list2.val)
{
list1.next=mergeTwoLists(list1.next,list2);
return list1;
}
else{
list2.next=mergeTwoLists(list1,list2.next);
return list2;
}
}
}