两个有序链表合并为一个有序链表(Java实现)

解题思路:

以升序为例

第一步当然是判空  如果其中一个链表为空  则返回另一个链表即可

要有序 所以需要比较结点大小  创建两个引用指向两个链表  同时分别创建将要合成链表的头和尾

比较两个结点的大小  将较小的结点 cur 放到新的链表尾部 

此时要考虑特殊情况 当新链表为空时  要把头和尾都设置成 cur 同时 cur 向后移 

新链表不为空时将 cur  放到尾部 同时 newTail 和 cur 向后移

最后再处理循环结束时 一个链表为空 另一个不为空的情况 直接将非空链表并到新链表尾部即可

//将两个有序链表合并为一个新的有序链表(升序为例)
    public ListNode conflateList(ListNode head1,ListNode head2) {
        //先进行判空
        if (head1 == null) {
            return head2;
        }
        if (head2 == null) {
            return head1;
        }
        //设置两个引用分别指向两个链表
        ListNode cur1 = head1;
        ListNode cur2 = head2;
        //设置将要合成的链表的头和尾
        ListNode newHead = null;
        ListNode newTail = null;
        //两个链表任何一个为空循环就终止
        while (cur1 != null && cur2 != null) {
            if (cur1.val <= cur2.val) {
                if (newHead == null) {
                    //当新链表为空时
                    newHead = cur1;
                    newTail = cur1;
                    cur1 = cur1.next;
                }
                //新链表不为空时
                newTail.next = cur1;
                newTail = newTail.next;
                cur1 = cur1.next;
            } else {
                if (newHead == null) {
                    newHead = cur2;
                    newTail = cur2;
                    cur2 = cur2.next;
                }
                newTail.next = cur2;
                newTail = newTail.next;
                cur2 = cur2.next;
            }
        }
        //循环终止之后 把还剩有结点的链表并到新链表尾部即可
        if (cur1 == null) {
            newTail.next = cur2;
        } else {
            newTail.next = cur1;
        }
        return newHead;
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章