Leetcode 21.合并两个有序链表

难度:简单

频率: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;
       }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值