LeetCoed刷题:21. 合并两个有序链表

发布时间:2024年01月04日

题目:

是否独立解出:否

解题时的思路与想法:解题时有几个问题:

1.怎么遍历两个数组,嵌套两个while循环不能实现(后面通过看题解知道list1!=null&&list2!=null

2.指定哪个链表为头结点(最开始想通过if语句在while循环的时候判断一下),后面通过看题解知道,可以提前创建一个new ListNode(-1)作为头结点

3.还有一个问题,就是最开始没有看懂为什么创建了头结点,ListNode prev=new ListNode(-1);后,还要创建一个ListNode pre = prev; ,后面了解到,prev只是作为头结点,静止不动,而pre需要不断去两个链表跳转。

4.关于返回值问题(一直以来是我比较迷惑的地方),如果返回list1或者2的话,只能返回一部分的节点值,返回pre则只会返回到最后一个节点(个人推测不确定对错)

解题思路:创建一个节点作为头结点,然后同时通过while循环遍历两个数组,用if语句判断出最小的那一个list,则用pre指向他,然后被指向的那个list向后移一位。然后pre也要随着list1与list2的比较大小不断地移动自己的位置。在结束循环之后,两个链表的长度可能并不是一样的,所以要把长的那一端直接添加到新链表最后面,返回头结点的下一个即可

解题代码:

class Solution {
    public ListNode mergeTwoLists(ListNode list1, ListNode list2) {   
        ListNode prev =new ListNode(-1);
        ListNode pre =prev;
        if(list1==null&&list2==null){return null;}
        if(list1==null){return list2;}
        if(list2==null){return list1;}
        while(list1!=null&&list2!=null){
              if(list2.val>=list1.val){
                  pre.next=list1;
                   list1=list1.next;
                }else{
                    pre.next=list2;
                   list2=list2.next;
                   
                }
                pre=pre.next;
            
        }
        pre.next=list1==null?list2:list1;
           
                 return prev.next;
    }
    
}

文章来源:https://blog.csdn.net/weixin_46139028/article/details/135392246
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。