21. 合并两个有序链表

119 阅读2分钟

题目描述:

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

image.png

题解思路:

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;
}