[算法练习-剑指offer]题16.合并两个排序的链表(Java)

题目

题号:16
题目名:合并两个排序的链表

编程语言

Java

题目描述

输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

初次思路

可以使用额外空间,也可以使用在原地修改的

这里使用在原地修改

首先定位首位小的为主,大的为副分支,目的是将副分支合并到主分支上

双指针遍历主副分支,如果主小于等于副,那么继续遍历,否则将副分支的结点插入,再后移,这里为了处理插入方便,添加一个主分支前置遍历指针

解题代码

public class Solution {
    public ListNode Merge(ListNode list1, ListNode list2) {
        //非空校验
        if (list1 == null && list2 == null) return null;
        if (list1 == null || list2 == null) return list1 == null ? list2 : list1;
        /**
         * 归并后要完成排序
         * 1.找到数字小的一端作为合并段
         * 2.设置两个指针对两个链表遍历,如果合并段大于另一段,就将另一段的结点插入,否则继续遍历
         * 3.有一个遍历完了就将领一个接在最后
         */
        ListNode merge = null;//主合并
        ListNode mergeTo = null;//被合并
        merge = list1.val<list2.val?list1:list2;
        mergeTo = list1.val<list2.val?list2:list1;
        ListNode curr1 = merge;//主合并遍历指针
        ListNode curr2 = mergeTo;//副合并遍历指针
        ListNode preCurr1 = curr1;//curr1前置,方便插入
        curr1=curr1.next;//curr1前置,方便插入
        while(curr1!=null&&curr2!=null) {
            //如果主合并小于等于分支,那么直接后移,不用将分支合并
            if(curr1.val<=curr2.val) {
                curr1 = curr1.next;
                preCurr1 = preCurr1.next;
            }else {
                //否则要将分支插入到主合并
                mergeTo = mergeTo.next;
                preCurr1.next = curr2;
                curr2.next = curr1;//插入完成
                preCurr1=preCurr1.next;
                curr2=mergeTo;
            }
        }
        //如果主分支为空,副分支有剩余,直接拼在主分支上,否则说明副分支拼完了
        if(curr1==null) preCurr1.next=mergeTo;
        return merge;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_41522089/article/details/107570702